对象的弹性搜索聚合

时间:2014-05-01 10:08:14

标签: elasticsearch aggregation

如何仅在对象属性上运行聚合查询,但获取结果中的所有属性?例如我想获得[{'doc_count': 1, 'key': {'id': 1, 'name': 'tag name'}}],但获得了[{'doc_count': 1, 'key': '1']。字段'tags'上的聚合返回零结果。

映射:

{
  "test": {
    "properties" : {
      "tags" : {
        "type" : "object",
        "properties": {
          "id" : {"type": "string", "index": "not_analyzed"},
          "name" : {"type": "string", "index": "not_analyzed", "enabled": false}
        }
      }
    }
  }
}

聚合查询:(仅按预期返回ID,但如何在结果中获取ID和名称对?)

'aggregations': {
  'tags': {
    'terms': {
      'field': 'tags.id',
      'order': {'_count': 'desc'},
    },
  }
}

修改 得到ID&通过汇总"script": "_source.tags"来命名,但仍在寻找更快的解决方案。

3 个答案:

答案 0 :(得分:5)

如果需要,您可以使用脚本,例如

"terms":{"script":"doc['tags.id'].value + '|' + doc['tags.name'].value"}

对于每个创建的存储桶,您将获得一个包含脚本中包含的字段值的键。但是说实话,聚合的目的不是返回完整的文档,而是要对文档组(存储桶)进行计算并返回结果,例如:总和和不同的价值观。您对查询实际执行的操作是根据字段tags.id。

创建存储桶

请注意,结果上的关键字包含两个以' |'分隔的值。所以你可能不得不操纵它的值来提取你需要的所有信息。

答案 1 :(得分:4)

它也可以嵌套聚合,你可以按id聚合,然后按名称聚合。

答案 2 :(得分:0)

其他信息,以上答案(cpard的答案)与嵌套对象完美配合。也许您得到的怪异结果是因为您使用的是对象而不是嵌套的对象。

这些类型之间的区别在于,嵌套对象保留了对象中元素之间的内部关系。这就是"terms":{"script":"doc['tags.id'].value + '|' + doc['tags.name'].value"}有意义的原因。如果使用对象类型,elasticsearch将不知道哪个tags.name与哪个tags.id

有关更多详细信息: https://www.elastic.co/blog/managing-relations-inside-elasticsearch