我有一个看起来像这样的文档:
{
...other stuff
"tags": [
{
"name": "Asian",
"key": "cuisine-asian"
},
{
"name": "Gluten Free",
"key": "cuisine-gluten-free"
}
我的索引映射如下:
tags: {
type: 'nested',
properties: {
name: {
type: 'text',
},
key: {
type: 'keyword',
}
}
key
字段保证是唯一的。
我正在尝试以完整形式返回所有“标签”的列表。我当前的查询可以返回带有键字段的存储桶列表,但是我不知道如何返回整个“标签”对象。
查询:
{
...
body: {
size: 0,
aggs: {
tags: {
nested: {
path: 'tags'
},
aggs: {
tag_list: {
terms: {
size: 999,
field: 'tags.key',
}
}
}
}
}
}
}
哪个生成响应:
"aggregations": {
"tags": {
"doc_count": 1708,
"tag_list": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "cuisine-asian",
"doc_count": 247
},
{
"key": "cuisine-drinks",
"doc_count": 112
},
我希望得到看起来更像以下内容的东西:
"buckets": [
{
"key": "cuisine-asian",
"name": "Asian",
"doc_count": 247
},
{
"key": "cuisine-drinks",
"name": "Drinks",
"doc_count": 112
},
[如果有关系/有帮助,doc_count
字段无关紧要-我只关心形式的基数列表
{
"key": "cuisine-drinks",
"name": "Drinks",
},
干杯!
您可以使用composite aggregation在tag_key和tag_name的合并值上创建存储桶。
在复合聚合中,after_key用于分页
查询:
{
"size": 0,
"aggs": {
"tag": {
"nested": {
"path": "tags"
},
"aggs": {
"tag_list": {
"composite": {
"sources": [
{
"tags_key": {
"terms": {
"field": "tags.key"
}
}
},
{
"tags_name": {
"terms": {
"field": "tags.name.keyword"
}
}
}
]
}
}
}
}
}
}
结果:
"aggregations" : {
"tag" : {
"doc_count" : 2,
"tag_list" : {
"after_key" : {
"tags_key" : "cuisine-gluten-free",
"tags_name" : "Gluten Free"
},
"buckets" : [
{
"key" : {
"tags_key" : "cuisine-asian",
"tags_name" : "Asian"
},
"doc_count" : 1
},
{
"key" : {
"tags_key" : "cuisine-gluten-free",
"tags_name" : "Gluten Free"
},
"doc_count" : 1
}
]
}
}
}
或者您也可以使用top_hits聚合来获取密钥下的完整文档。查询:
{
"size": 0,
"aggs": {
"tags": {
"nested": {
"path": "tags"
},
"aggs": {
"tag_list": {
"terms": {
"size": 999,
"field": "tags.key"
},
"aggs": {
"docs": {
"top_hits": {
"size": 10
}
}
}
}
}
}
}
}
结果:
"aggregations" : {
"tags" : {
"doc_count" : 2,
"tag_list" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "cuisine-asian",
"doc_count" : 1,
"docs" : {
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "index26",
"_type" : "_doc",
"_id" : "yMDvAXIB90IHVdbFflZp",
"_nested" : {
"field" : "tags",
"offset" : 0
},
"_score" : 1.0,
"_source" : {
"name" : "Asian",
"key" : "cuisine-asian"
}
}
]
}
}
},
{
"key" : "cuisine-gluten-free",
"doc_count" : 1,
"docs" : {
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "index26",
"_type" : "_doc",
"_id" : "yMDvAXIB90IHVdbFflZp",
"_nested" : {
"field" : "tags",
"offset" : 1
},
"_score" : 1.0,
"_source" : {
"name" : "Gluten Free",
"key" : "cuisine-gluten-free"
}
}
]
}
}
}
]
}
}
}
}