当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch中查询和过滤器的区别

颜举
2023-03-14

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

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

所有我想要的是过滤4个属性值,放在一个日期范围和总和(聚合)在几个字段。像这样

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

共有1个答案

寿和通
2023-03-14

将查询视为模糊匹配,将筛选器视为传统数据库风格的查询。如果这有助于将查询看作一个数据库,尽管更好。

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

过滤器只说我是否包括或排除这段数据,不涉及得分。要么筛选器匹配并包含文档,要么不匹配并排除文档。这一切都发生得很快,不涉及排序。

您的示例“query”不需要查询,它是对name=a和age=b的筛选器。查询可能包括匹配name=AA的文档,因为它有点像a。因此,您对name有一个术语筛选器,对age有一个术语筛选器,对join_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" }
    }
}
}
 类似资料:
  • 问题内容: “过滤后的查询和过滤器”与“根查询和过滤器”之间有什么区别吗?例如 情况1: 情况2: 我在http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using- filter-outside-td3960119.html中 找到了此讨论,但所引用的URL是404,并且解释过于简洁我。 请示教或提供指出这些区别的

  • 问题内容: 我想查询日期范围内的elasticsearch文档。我现在有两个选择,两个都适合我。已经测试了他们两个。1.范围查询2.范围过滤器 由于我现在的数据集很小,因此无法测试它们的性能。两者有什么区别?哪个会导致更快地检索文档和更快地响应? 问题答案: 查询和过滤器之间的主要区别在于评分。查询将返回每个文档具有相对排名得分的文档。过滤器没有。这种差异使过滤器更快,有两个原因。首先,它不会产生

  • 我不熟悉Elasticsearch和Nest,请原谅我的无知。我想在Elasticsearch v2.3.5中使用过滤器和multi\u匹配查询,但到目前为止,我还无法解决这个问题。我想,一旦我把它用于Elasticsearch,我应该能够将它映射到Nest。 以下是我的JSON数据结构: 下面是我的工作搜索查询(没有任何过滤器): 我只想在搜索结果中向用户显示这些记录,其中: 我尝试了不同的查询

  • 我试图编写一个由2个部分组成的弹性搜索布尔查询。我想要“必须”的两个条件和“应该”的两个条件。问题是我只想得到“应该”的分数。我尝试了“过滤器”,但没有成功。 你有什么想法吗?

  • 我阅读了一些关于查询上下文和过滤上下文的文章和文档,了解到如果你不需要进行全文搜索或评分,最好使用过滤上下文。就我而言,我想返回包含ID的日志……所以我意识到我应该只使用过滤上下文而不是查询上下文。除了全文搜索或评分之外,是否有一条硬基线来定义何时应该使用其中一个? 所以我从我最初的DSL查询搜索cmd: 到过滤器上下文: 因为,我想使用NEST来执行我采用这种方法的查询搜索。 这是使用NEST进

  • 我有多个嵌套文档doc。嵌套查询工作正常,但它们仍然会返回所有嵌套对象(即整个文档),即使搜索查询只匹配少数嵌套对象。但是,它确实将文档作为一个整体进行过滤。 下面是一个例子: 当在地址中搜索时,理想情况下,我应该只获得带有一个嵌套对象的,但我会获得所有嵌套对象。如何筛选返回的嵌套对象? 示例查询: 该查询的输出是和所有员工,而我只想要。