query 和 filter区别
query和filter的区别简述
query关注点:此文档与此查询子句的匹配程度如何
filter关注点:此文档和查询子句匹配吗
Query查询的细化关注点:
-
query查询的结果集判断标准
1、是否包含
即该文档是否应该成为结果的一部分,也即是否满足过滤条件
2、相关度得分
除了是否满足过滤条件以外,查询子句还计算了文档与其它文档相比的匹配程度,也就是文档得分_score
3、得分越高,相关度越高
得分越高的文件,搜索时排名越靠前
-
典型应用场景:
1、全文检索,多针对text字段,有相关性评分的
这种相关性搜索,很少有完全“正确”的答案。
如:
文档中存在字段hotel_name:“上海浦东香格里拉酒店”
IK实际分词结果如下:
上海浦东,上海,浦东,香格里拉,格里,里拉,酒店。
也就是说,搜索以上关键词都能搜到:hotel_name:“上海浦东香格里拉酒店”的酒店。这些都是“相关”的。
因此在实际使用时,需要一个扥分项来决定,哪些应该靠前输出,也就是适合使用query
filter过滤的细化关注点:
-
filter过滤的结果集判断标准
1、是否包含
即该文档是否应该成为结果的一部分,也即是否满足过滤条件
2、无相关度得分
所有满足过滤条件的项,彼此没有区别。不存在排名靠前的说法,也就是不需要_score来决定靠前。
3、针对结构化数据
适用于精确匹配,范围搜索。
如: 时间戳timestamp是否在2015年到2016年之间
如: 状态值是否为400
4、更快
因为不需要做得分计算,也就是更快。
另外经常使用的过滤器会被es自动缓存下来,加速访问,挺高了整体性能
query和filter的性能不同
过滤查询(filter)是对集合包含/排除的简单检查,这使得它们计算速度非常快。 当至少有一个过滤查询是“稀疏”(仅有少量匹配的文档)时,可以利用各种优化,并且可以将缓存经常使用的filter过滤查询缓存在内存中以加快访问速度。对比之下,query检索(评分查询)不仅要查找匹配的文档,还要计算每个文档的相关程度,这通常会使其比非评分文档更复杂。 另外,查询结果不可缓存。
由于倒排索引,只有几个文档匹配的简单评分查询(query检索)可能会比跨越数百万个文档的过滤器(filter过滤)表现得更好。 但是,一般来说,fiter过滤的性能将胜过评分查询(query检索)。
过滤(filter)的目标是减少必须由评分查询(query)检查的文档数量。
filter过滤怎么缓存呢?
Elasticsearch将创建一个文档匹配过滤器的位集bitset(如果文档匹配则为1,否则为0)。 随后用相同的过滤器执行查询将重用此信息。
每当添加或更新新文档时,位集bitset也会更新。

浙公网安备 33010602011771号