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

时间:2018-01-08 15:14:18

标签: elasticsearch search full-text-search elasticsearch-5

我在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字段声明为映射中的嵌套字段。

2 个答案:

答案 0 :(得分:1)

你把事情搞混了。您可能希望添加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
              }
            }
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

在Filter-Aggregation中尝试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
              }
            }
          }
        }
      }
    }
  }
}

BTW:如果要检索所有存储桶,可以在聚合大小中编写0而不是9999