• ES之六:ElasticSearch中Filter和Query的异同


    如下例子,查找性别是女,所在的州是PA,过滤条件是年龄是39岁,balance大于等于10000的文档:

    复制代码
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "gender": "F"
              }
            },
            {
              "match": {
                "state": "PA"
              }
            }
          ],
          "filter": [
            {
              "term": {
                "age": "39"
              }
            },
            {
              "range": {
                "balance": {
                  "gte": "10000"
                }
              }
            }
          ]
        }
      }
    }
    复制代码

    返回结果:

    查询虽然包含这两种,但是查询在不同的执行环境下,操作还是不一样的。

    Query与Filter

    查询在Query查询上下文和Filter过滤器上下文中,执行的操作是不一样的:

    Query查询上下文:

    在查询上下文中,查询会回答这个问题——“这个文档匹不匹配这个查询,它的相关度高么?”

    如何验证匹配很好理解,如何计算相关度呢?之前说过,ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。

    查询上下文 是在 使用query进行查询时的执行环境,比如使用search的时候。

    Filter过滤器上下文:

    在过滤器上下文中,查询会回答这个问题——“这个文档匹不匹配?”

    答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。

    过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter。

    另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。

    总结

    1 查询上下文中,查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;在过滤器上下文中,查询操作仅判断是否满足查询条件

    2 过滤器上下文中,查询的结果可以被缓存。

  • 相关阅读:
    不兼容结构的协调—适配器模式(三)
    Java的时间空间复杂度详解
    Java学习笔记之变量和类变量的访问哲学
    求最大公约数-辗转相除法
    java中怎么遍历HashMap
    Java编程时如何节省内存,效率高
    Java入门需掌握的30个基本概念
    Java各种获取系统当前时间方法和格式
    Java 实现顺序结构线性列表
    Java编程中异常处理的优劣之道
  • 原文地址:https://www.cnblogs.com/duanxz/p/6528168.html
Copyright © 2020-2023  润新知