zoukankan      html  css  js  c++  java
  • elasticsearch中query和filter的区别

    参考博客来自:

    https://mp.weixin.qq.com/s/tiiveCW3W-oDIgxvlwsmXA?utm_medium=hao.caibaojian.com&utm_source=hao.caibaojian.com

    query关注点:此文档与此查询子句的匹配程度如何?
    filter关注点:此文档和查询子句匹配吗?

    query 上下文的条件是用来给文档打分的,匹配越好 _score 越高;filter 的条件只产生两种结果:符合与不符合,后者被过滤掉。 这个 总结可以

    2、Query检索细化关注点

    1)是否包含?

    确定文档是否应该成为结果的一部分.

    2)相关度得分多少?

    除了确定文档是否匹配外,查询子句还计算了表示文档与其他文档相比匹配程度的_score。

    3)得分越高,相关度越高。

    更相关的文件,在搜索排名更高。

    典型应用场景:

    1)全文检索——这种相关性的概念非常适合全文搜索,因为很少有完全“正确”的答案。

    举例如下:

    文档中存在字段hotel_name:“上海浦东香格里拉酒店”

    IK实际分词结果如下:
    上海浦东,上海,浦东,香格里拉,格里,里拉,酒店。

    也就是说,搜索以上关键词都能搜到:hotel_name:“上海浦东香格里拉酒店”的酒店。这些都是“相关”的。

    但是搜索:“香格里” 是搜索不到结果的。

    2)包含单词“run”, 但也匹配"runs", "running", "jog"或者"sprint"。(都是奔跑的意思)

    3、filter过滤细化关注点

    1)是否包含?

    确定是否包含在检索结果中,回答只有“是”或“否”。

    2)不涉及评分。

    在搜索中没有额外的相关度排名。

    3)针对结构化数据。

    适用于完全精确匹配,范围检索。

    参见官网举例:
    以下场景适用于filter过滤检索:

    举例1:时间戳timestamp 是否在2015至2016年范围内?

    举例2:状态字段status 是否设置为“published”?

    4)更快

    只确定是否包括结果中,不需要考虑得分。

    为什么会更快?——经常使用的过滤器将被Elasticsearch自动缓存,以提高性能。

    过滤(filter)的目标是减少必须由评分查询(query)检查的文档数量。

    6、使用场景

    • 全文检索以及任何使用相关性评分的场景使用query检索。

    • 除此之外的其他使用filter过滤器过滤。

    举例

    GET /_search
    {
      "query": { 
        "bool": { 
          "must": [
            { "match": { "title":   "Search"        }}, 
            { "match": { "content": "Elasticsearch" }}  
          ],
          "filter": [ 
            { "term":  { "status": "published" }}, 
            { "range": { "publish_date": { "gte": "2015-01-01" }}} 
          ]
        }
      }
    }
  • 相关阅读:
    「算法笔记」斜率优化
    「算法笔记」多项式求逆
    「算法笔记」霍尔定理
    「算法笔记」Min_25 筛
    「算法笔记」点分治
    「算法笔记」生成函数入门
    「算法笔记」快速数论变换(NTT)
    Spring Boot+Vue全栈开发实战PDF+源代码
    宅米网性能优化实践
    PHP 性能分析第一篇: Xhprof & Xhgui 介绍
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/13020862.html
Copyright © 2011-2022 走看看