如何仅在对象属性上运行聚合查询,但获取结果中的所有属性?例如我想获得[{'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"
来命名,但仍在寻找更快的解决方案。
答案 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