filter - ElasticSearch 中查询和过滤器的区别

标签 filter elasticsearch

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

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

我只想按 4 个属性值过滤,放入一个日期范围,然后对几个字段求和(聚合)。像这样

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

最佳答案

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

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

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

您的示例“查询”不需要查询,它是名称 = A 和年龄 = B 的过滤器。查询可能包含匹配名称 = 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" }
    }
}
}

关于filter - ElasticSearch 中查询和过滤器的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29268763/

相关文章:

list - Prolog:过滤列表?

swift - 如何过滤 combineLatest 仅在一项更改时触发?

elasticsearch - Kibana脚本字段中的Groovy脚本

java - Elasticsearch - 如何对索引中的匹配项进行分组和计数

elasticsearch - 弹性查询仅接受4个字符

javascript - 通过检查作用域变量在 Angular.js 中进行过滤

filter - 谷歌分析嵌入式仪表板过滤器

search - 在Elasticsearch中按子项聚合过滤父项

elasticsearch - Dokku:如何在插件中更改Elasticsearch的版本

java - 瓦丁 : Filtering output on the table