我按标签聚合产品搜索结果,标签有名称和ID字段。如何将两个字段都放回聚合桶中?我可以得到一个或另一个,但我无法弄清楚如何获得两者。 BTW,我的群集上的脚本访问权限已关闭,因此我无法使用该功能。
这是我的产品映射(针对此问题进行了简化):
videotestsrc
这是我的疑问:
"mappings": {
"products": {
"properties": {
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"topics": {
"properties": {
"id": {
"type": "string",
"index": "not_analyzed"
},
"name": {
"type" : "string",
"index": "not_analyzed"
}
}
}
}
}
}
我的聚合桶看起来像这样:
..." key"第一个存储桶中的值是topics.id字段值。有没有办法将我的topics.name字段添加到存储桶?
答案 0 :(得分:4)
如果要在存储桶中添加另一个字段作为键,则(id,name)将充当唯一存储桶。您需要id和名称之间的关联。如果没有嵌套映射,则id和名称列表是单独的数组。因此,您需要将其映射为嵌套。
主题“:{ “类型”:“嵌套”, “properties”:{ “ID”: { “type”:“string”, “index”:“not_analyzed” }, “名称”: { “type”:“string”, “index”:“not_analyzed” } } }
要在多个字段上进行汇总,您需要使用sub-aggregations。
以下是一个示例聚合查询:
{
"aggs": {
"topics_agg": {
"nested": {
"path": "topics"
},
"aggs": {
"name": {
"terms": {
"field": "topics.id"
},
"aggs": {
"name": {
"terms": {
"field": "topics.name"
}
}
}
}
}
}
}
}
聚合样本结果:
"aggregations": {
"topics_agg": {
"doc_count": 5,
"name": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"id": 123,
"doc_count": 6,
"name": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "topic1",
"doc_count": 3
},
{
"key": "topic2",
"doc_count": 3
}
]
}
},
{
"key": 456,
"doc_count": 2,
"name": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "topic1",
"doc_count": 2
}
]
}
},
..............
注意:对于id:123,有多个名称存储桶。由于同一个id有多个名称值。要创建单独的唯一存储桶,只需创建所有父子组合。
例如。 123-topic1, 123-topic2, 456-topic1