【问题标题】:Different between query and filters in ElasticSearchElasticSearch 中查询和过滤器的区别
【发布时间】:2015-05-29 21:31:39
【问题描述】:

我对查询和过滤器之间的区别有点困惑。我的困惑源于我在文档中阅读的以下句子。

  1. 建议使用过滤器而不是查询,因为过滤器不会触发分数计算。
  2. 仅当响应为是/否或精确搜索时才应使用过滤器。
  3. 过滤器可以包含称为“查询过滤器”的查询(如“术语过滤器”等)

我想要的只是按 4 个属性值过滤,放入一个日期范围并在几个字段上求和(聚合)。像这样

sum (salary, tenure) where name = A AND age = B AND join_date between X and Y 

【问题讨论】:

    标签: filter elasticsearch


    【解决方案1】:

    将查询视为模糊匹配,将过滤器视为传统的数据库样式查询。如果它有助于将查询视为数据库 LIKE,虽然更好。

    该查询将分析您的搜索,将其分解为多个位,然后搜索与您的查询相似的文档。每个文档获得一个分数,最好的分数获胜,并在结果集中按分数顺序返回。所有这些评分都很昂贵,并且会减慢您的响应速度。

    过滤器只说明我是否包含或排除这条数据,不涉及分数。过滤器匹配并且包含文档,或者不匹配并且被排除。这一切都发生得非常快,并且不涉及排序。

    您的示例“查询”不需要查询,它是 name = A 和 age = B 的过滤器。查询可能包括匹配 name = AA 的文档,因为它有点像 A。所以你有一个术语过滤器在名称和年龄过滤器上,在 join_date 上使用范围过滤器。然后您可以进行聚合以获得您的 SUM。

    {
    "query": {
        "filtered": {
            "filter": {
                "and": [
                    { "range": {
                        "join_date": {
                            "from": "X",
                            "to": "Y"
                        }
                    }},
                    {"term": { "name": "A" }},
                    {"term": { "age": "B" }},
                ]
            }
        }
    },
    "size": 0,
    "aggs" : {
        "salary_sum": {
                "sum": { "field": "salary" }
        },
        "tenure_sum": {
                "sum": { "field": "tenure" }
        }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多