【问题标题】:Elasticsearch aggregate counts based on a filter基于过滤器的 Elasticsearch 聚合计数
【发布时间】:2016-04-18 16:42:03
【问题描述】:

过去,我曾使用 Solr 处理过多个基于方面和过滤器的搜索,但我正在努力实现与 Elasticsearch 的平等。

我了解聚合是根据查询结果计算的,如果未指定查询,则在全局范围内计算。这很好,但是我希望这些聚合的 计数 基于过滤器的结果。

在 Solr 中这很简单 - 只需指定查询和过滤器 - 但在 Elasticsearch 中,过滤器对聚合没有影响,文档非常混乱。

我想要的以下查询的输出是将suggestions 存储桶限定为查询范围,但其中的结果计数限定为指定的filter

{
    "size": 0,
    "query": {
        "range": {
            "published": {
                "gte": "now-1y",
                "lt": "now"
            }
        }
    },
    "filter": {
        {
            "term": {
                "tag.id": "123"
            }
        },
        {
            "term": {
                "tag.id": "456"
            }
        },
    },
    "aggs": {
        "tags": {
            "nested": {
                "path": "tag"
            },
            "aggs": {
                "suggestions": {
                    "terms": {
                        "field": "name",
                        "size": 10,
                        "min_doc_count": 1
                    },
                    "aggs": {
                        "id": {
                            "terms": {
                                "field": "id",
                                "size": 1
                            }
                        }
                    }
                }
            }
        }
    }
}

并给出示例映射:

{
    "mappings":{
        "content":{
            "properties":{
                "id":{
                    "type":"string",
                    "index":"not_analyzed"
                },
                "title":{
                    "type":"string"
                },
                "byline":{
                    "type":"string",
                    "index":"not_analyzed"
                },
                "body":{
                    "type":"string"
                },
                "publishedDate":{
                    "type":"date",
                    "format":"dateOptionalTime"
                },
                "tag":{
                    "type":"nested",
                    "include_in_parent":true,
                    "properties":{
                        "id":{
                            "type":"integer"
                        },
                        "name":{
                            "type":"string"
                        }
                    }
                }
            }
        }
    }
}

感谢任何帮助。

【问题讨论】:

  • 您是否尝试使用filtered aggregation
  • 我有,但我无法获得预期的结果。我会进一步调查。
  • 我不太明白您要做什么。你能解释一下吗?

标签: elasticsearch lucene faceted-search


【解决方案1】:

您可以通过以下方式获得预期的结果:

  1. 将查询保留在原处,
  2. 但将filter 部分(实际上您所拥有的相当于post_filter,并且仅在聚合运行后应用于结果)移动到filter 聚合中

基本上这应该可以工作:

{
  "size": 0,
  "query": {
    "range": {
      "published": {
        "gte": "now-1y",
        "lt": "now"
      }
    }
  },
  "aggs": {
    "tags": {
      "nested": {
        "path": "tag"
      },
      "aggs": {
        "suggestions": {
          "terms": {
            "field": "tag.name",
            "size": 10,
            "min_doc_count": 1
          },
          "aggs": {
            "filtered": {
              "filter": {
                "terms": {
                  "tag.id": [
                    "123",
                    "456"
                  ]
                }
              },
              "aggs": {
                "id": {
                  "terms": {
                    "field": "tag.id",
                    "size": 1
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

【讨论】:

  • 酷,很高兴它有帮助!
  • 对不起...我有点早产了!不幸的是,此请求将导致所有计数为 0。过滤器聚合是否应该反转嵌套?
  • 您能否分享一个示例文档和您的映射,以便我重现该问题?
  • 添加了示例映射 =]
  • 您能否分享一个示例文档以及您对它的期望。有了我正在使用的文档,我确实得到了计数。
猜你喜欢
  • 2015-09-17
  • 2014-02-02
  • 2017-03-02
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多