ElasticSearch中的查询
如下图截自ES官网,在最外层bool查询之外,还应该有一层query包裹着,我们再加上filter。如下代码所示完整版本。
![](https://img.haomeiwen.com/i19588241/62e989b6e3e4a5cc.png)
GET /_search
{
"query": {
"bool": {
"must": {
"match": {
"email": "business opportunity"
}
},
"should": [
{
"match": {
"starred": true
}
},
{
"bool": {
"must": {
"match": {
"folder": "inbox"
}
},
"must_not": {
"match": {
"spam": true
}
}
}
}
],
"filter": {
"range": {
"create_time": {
"gte": "2021-03-15"
}
}
},
"minimum_should_match": 1
}
}
}
ElasticSearch查询中query和filter的区别
从上面的代码中可以清晰的看出query和filter并不是一个层级的关键字,query查询包括filter关键字查询。两者本来没有比较关系,提问本身可以说是不严谨的,就好像问SQL语句中select和where的区别一样。而在ES中,面试时面试官提出这个问题本质是询问两者执行时所产生的查询策略上和执行效果上的区别,考察候选人对于ES查询的理解。
判断是否包含
Query确定文档是否是结果的一部分,Filter确定文档是否在结果中,只有“是”或“否”。
分数值
Query确定文档是否是结果的一部分后,会根据匹配程度打出对应的score(分数),Filter因为只有“是”或“否”,所以不会打分。
Query是分数值越高表示就越匹配。
Filter适合精确匹配和范围查询。
执行速度
Filter仅仅确定是否包括在结果中,不需要考虑得分,另外常使用的过滤器将被Elasticsearch自动缓存,Filter相比Query更快一些。
结论
Query更适合全文检索以及任何需要使用相关性评分的场景。除此之外,如果有可能尽量使用Filter查询。
网友评论