elasticsearch,Filter,elasticsearch" /> elasticsearch,Filter,elasticsearch" />

Filter ElasticSearch中查询和过滤器的不同之处

Filter ElasticSearch中查询和过滤器的不同之处,filter,elasticsearch,Filter,elasticsearch,我对查询和过滤器之间的区别有点困惑。我的困惑源于我在文档中读到的以下句子 建议对查询使用筛选器,因为筛选器不会触发分数计算 仅当响应为是/否或精确搜索时,才应使用过滤器 过滤器可以有称为“查询过滤器”的查询(如“术语过滤器”等) 我只想通过4个属性值进行过滤,放入一个日期范围,并对几个字段求和(聚合)。像这样 sum (salary, tenure) where name = A AND age = B AND join_date between X and Y 将查询视为模糊匹配,将过滤器

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

  • 建议对查询使用筛选器,因为筛选器不会触发分数计算
  • 仅当响应为是/否或精确搜索时,才应使用过滤器
  • 过滤器可以有称为“查询过滤器”的查询(如“术语过滤器”等)
  • 我只想通过4个属性值进行过滤,放入一个日期范围,并对几个字段求和(聚合)。像这样

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

    将查询视为模糊匹配,将过滤器视为传统数据库样式的查询。如果它有助于将查询看作一个数据库,尽管更好

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

    一个过滤器说,我只需包含或排除这段数据,不涉及分数。过滤器匹配且包含文档,或者不匹配且排除文档。这一切发生得很快,不涉及排序

    您的示例“查询”不需要查询,它是name=a和age=B上的筛选器。查询可能包括与name=AA匹配的文档,因为它有点像a。因此,您有name上的术语筛选器和age上的术语筛选器,join\u date上有一个范围筛选器。然后,您可以进行聚合以得到您的总和

    {
    "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" }
        }
    }
    }