Elasticsearch:聚合过滤嵌套对象以查找唯一值

Elasticsearch: Aggregation on filtered nested objects to find unique values

我在 Elasticsearch 5 的每个文档中都有一个对象(标签)数组:

{
    "tags": [
        { "key": "tag1", "value": "val1" },
        { "key": "tag2", "value": "val2" },
        ...
    ]
}

现在我想为某个标签键找到唯一的标签值。与此 SQL 查询类似的内容:

SELECT DISTINCT(tags.value) FROM tags WHERE tags.key='some-key'

到目前为止我已经接触过这个DSL:

{
    "size": 0,
    "aggs": {
        "my_tags": {
            "nested": {
                "path": "tags"
            },
            "aggs": {
                "filter" : { "terms": { "tags.key": "tag1" } },
                "aggs": {
                    "my_tags_values": {
                        "terms" : {
                            "field" : "tags.value",
                            "size": 9999
                         }
                    }                   
                }
            }
        }
    }
}

但是它向我显示了这个错误:

[terms] unknown field [tags.key], parser not found.

这是解决问题的正确方法吗?感谢您的帮助。

注意:我已将 tags 字段声明为映射中的嵌套字段。

你搞混了。您可能想添加一个 filter 聚合,但没有给它任何名称:

{
  "size": 0,
  "aggs": {
    "my_tags": {
      "nested": {
        "path": "tags"
      },
      "aggs": {
        "my_filter": {
          "filter": {
            "terms": {
              "tags.key": [
                "tag1"
              ]
            }
          },
          "aggs": {
            "my_tags_values": {
              "terms": {
                "field": "tags.value",
                "size": 9999
              }
            }
          }
        }
      }
    }
  }
}

在过滤器聚合中尝试Bool Query

{
  "size": 0,
  "aggs": {
    "my_tags": {
      "nested": {
        "path": "tags"
      },
      "aggs": {
        "filter": {
          "bool": {
            "must": [
              {
                "term": {
                  "tags.key": "tag1"
                }
              }
            ]
          },
          "aggs": {
            "my_tags_values": {
              "terms": {
                "field": "tags.value",
                "size": 0
              }
            }
          }
        }
      }
    }
  }
}

顺便说一句:如果你想检索所有的桶,你可以在聚合大小中写 0 而不是 9999