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也会更新。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2020-12-19 22:44  dos_hello_world  阅读(526)  评论(0)    收藏  举报