首页 文章

ElasticSearch中的查询和过滤器之间有所不同

提问于
浏览
3

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

建议使用

  • 过滤器而不是查询,因为过滤器不会触发分数计算 .

  • 仅当响应为是/否或精确搜索时才应使用过滤器 .

  • 过滤器可以有名为'query filters'的查询(如'term filter'等)

我想要的只是过滤4个属性值,放入日期范围和总和(聚合)几个字段 . 像这样

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

1 回答

  • 10

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

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

    过滤器说我只是包含或排除这段数据,不涉及分数 . 过滤器匹配并且包含doc或者不包含doc,它将被排除 . 这一切都很快发生,并且没有涉及排序 .

    您的示例“查询”不需要查询,它是名称= A和年龄= 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" }
        }
    }
    }
    

相关问题