文章目录

  • 0. 实验背景
  • 1. 数据准备
  • 1. match and查询场景
  • 2. query_string and查询场景
  • 3. term and查询场景
  • 4. 结论


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:具体用哪种和数据结构密切相关,需要提前设计好数据结构和入库的处理方式,这个对个人的考验比较大。