如何创建一个Elasticsearch过滤器聚合,聚合在两个字段上?

t5fffqht  于 2023-05-28  发布在  ElasticSearch
关注(0)|答案(1)|浏览(99)

我有两个关键字的弹性字段是ID。两个字段可以包含相同的值。
我一直在创建一个过滤器聚合,以获得其中一个字段的前10个计数(应用了一些过滤器,这与此问题无关)。
我现在需要创建一个过滤器聚合,以根据这两个字段获得前10个计数。
因此,对于给定的ID '1234',它将是field 1 = 1234field 2 = 1234的文档计数。获取单个ID的计数当然很容易,但是否可以在这样的聚合中使用两个字段?
Elasticsearch v7.12.1我注意到'combined_fields'是在v7.13中引入的-我不知道它是否相关。

sczxawaw

sczxawaw1#

更新答案

Tldr;

这不可能仅通过聚合来实现。
您必须以某种方式将这些术语分组到一个字段中。您可以使用运行时字段(因此不需要重新索引)

解决方案

GET /76328180/_search
{
  "size": 0,
  "aggs": {
    "NAME": {
      "terms": {
        "field": "field_agg"
      }
    }
  }
}

什么是field_agg
在这种情况下:

POST _bulk
{"index":{"_index": "76328180"}}
{"field_1": 1234, "field_2": 234, "field_agg": [1234, 234]}
{"index":{"_index": "76328180"}}
{"field_1": 1234, "field_2": 345, "field_agg": [1234, 345]}
{"index":{"_index": "76328180"}}
{"field_1": 123, "field_2": 1234, "field_agg": [123, 1234]}
{"index":{"_index": "76328180"}}
{"field_1": 234, "field_2": 4567, "field_agg": [234, 4567]}

初步答复

Tldr;

听起来像是filters aggregation的工作。

解决方案

使用以下查询:

GET /76328180/_search
{
  "size": 0, 
  "aggs": {
    "values": {
      "filters": {
        "filters": {
          "1234": {
            "bool": {
              "should": [
                {
                  "term": {
                    "field_1": 1234
                  }
                },
                {
                  "term": {
                    "field_2": 1234
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}

应该给予你:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  },
  "aggregations": {
    "values": {
      "buckets": {
        "1234": {
          "doc_count": 3
        }
      }
    }
  }
}

复制:

设置:

POST _bulk
{"index":{"_index": "76328180"}}
{"field_1": 1234, "field_2": 234}
{"index":{"_index": "76328180"}}
{"field_1": 1234, "field_2": 345}
{"index":{"_index": "76328180"}}
{"field_1": 123, "field_2": 1234}
{"index":{"_index": "76328180"}}
{"field_1": 234, "field_2": 4567}

相关问题