[TOC]
0. 实验背景
主要测试并(and)查询场景下,query_string、match、term三种可以满足并查询条件的方式以及彼此的差异
1. 数据准备
ES中插入两个doc。doc对应的数据结构,tags keyword; tags0 text;
{
"tags0":["马云","阿里巴巴","支付宝"]
"tags1":"马云 阿里巴巴 支付宝"
}
{
"tags0":[""阿里巴巴","支付宝","马云"]
"tags1":"阿里巴巴 支付宝 马云"
}
1. match and查询场景
查询条件
{"query": {"bool": {"must": [
{"match":{"tag1":{"query":"马云 阿里巴巴","operator":"and"}}}
] } }}
返回结果
{
"tags0":["马云","阿里巴巴","支付宝"]
"tags1":"马云 阿里巴巴 支付宝"
}
2. query_string and查询场景
查询条件
{"query": {"bool": {"must": [
{"query_string":{"query":"tags1:马云 AND 阿里巴巴"}}
] } }}
返回结果
{
"tags0":["马云","阿里巴巴","支付宝"]
"tags1":"马云 阿里巴巴 支付宝"
}
{
"tags0":[""阿里巴巴","支付宝","马云"]
"tags1":"阿里巴巴 支付宝 马云"
}
3. term and查询场景
查询条件
{"query": {"bool": {"must": [
{"term":{"tags0":"马云"}},
{"term":{"tags0":"阿里巴巴"}}
] } }}
返回结果
{
"tags0":["马云","阿里巴巴","支付宝"]
"tags1":"马云 阿里巴巴 支付宝"
}
{
"tags0":[""阿里巴巴","支付宝","马云"]
"tags1":"阿里巴巴 支付宝 马云"
}
4. 结论
结论1: query_string与match的不同
match查询对字段分词后的匹配顺序严格,query_string对字段的匹配顺序不严格,能检索到更多的内容,字段使用更灵活,但是对应的也会消耗更多的资源和性能,查询速度也会更慢。
结论2: term与前两者的不同
term这里的查询应该比较好理解,数据结构不同导致的查询方式的不同,前两者为text分词场景,term精准查询的速度更快。实际生产中给出的建议是,如果要用term字段务必保证打的标签是已经分词后的最细结果了,比如“哥德经典语录”类似这样的标签,尽量拆分成 “哥德”,“经典语录”。否则的话效果没前两者要好。
- tips:具体用哪种和数据结构密切相关,需要提前设计好数据结构和入库的处理方式,这个对个人的考验比较大。
如有其它问题,也可以咨询本人 微信:w63594021
欢迎体验本公司产品: Get智能写作