如何使top-hits聚合的结果多样化?
How to diversify the result of top-hits aggregation?
让我们从一个具体的例子开始。我有一个包含这些字段的文档:
{
"template": {
"mappings": {
"template": {
"properties": {
"tid": {
"type": "long"
},
"folder_id": {
"type": "long"
},
"status": {
"type": "integer"
},
"major_num": {
"type": "integer"
}
}
}
}
}
}
我想按字段 folder_id
聚合查询结果,并为每个组除以 folder_id
,检索前 N 个文档的 _source
详细信息。所以我像这样写查询 DSL:
GET /template/template/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"status": 1
}
}
]
}
},
"aggs": {
"folder": {
"terms": {
"field": "folder_id",
"size": 10
},
"aggs": {
"top_hit":{
"top_hits": {
"size": 5,
"_source": ["major_num"]
}
}
}
}
}
}
但是,现在要求每个 folder_id
的热门文档必须在领域 major_num
上多样化。对于每个 folder_id
,terms
聚合下的子 top_hits
聚合检索的热门文档,在字段 major_num
上必须是唯一的,并且对于每个 major_num
value, return sub top hits聚合结果中最多1个文档。
top_hits
聚合不能接受子聚合,请问如何解决?
为什么不简单地在 major_num
字段上添加另一个 terms
聚合?
GET /template/template/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"status": 1
}
}
]
}
},
"aggs": {
"folder": {
"terms": {
"field": "folder_id",
"size": 10
},
"aggs": {
"majornum": {
"terms": {
"field": "major_num",
"size": 10
},
"aggs": {
"top_hit": {
"top_hits": {
"size": 1
}
}
}
}
}
}
}
}
让我们从一个具体的例子开始。我有一个包含这些字段的文档:
{
"template": {
"mappings": {
"template": {
"properties": {
"tid": {
"type": "long"
},
"folder_id": {
"type": "long"
},
"status": {
"type": "integer"
},
"major_num": {
"type": "integer"
}
}
}
}
}
}
我想按字段 folder_id
聚合查询结果,并为每个组除以 folder_id
,检索前 N 个文档的 _source
详细信息。所以我像这样写查询 DSL:
GET /template/template/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"status": 1
}
}
]
}
},
"aggs": {
"folder": {
"terms": {
"field": "folder_id",
"size": 10
},
"aggs": {
"top_hit":{
"top_hits": {
"size": 5,
"_source": ["major_num"]
}
}
}
}
}
}
但是,现在要求每个 folder_id
的热门文档必须在领域 major_num
上多样化。对于每个 folder_id
,terms
聚合下的子 top_hits
聚合检索的热门文档,在字段 major_num
上必须是唯一的,并且对于每个 major_num
value, return sub top hits聚合结果中最多1个文档。
top_hits
聚合不能接受子聚合,请问如何解决?
为什么不简单地在 major_num
字段上添加另一个 terms
聚合?
GET /template/template/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"status": 1
}
}
]
}
},
"aggs": {
"folder": {
"terms": {
"field": "folder_id",
"size": 10
},
"aggs": {
"majornum": {
"terms": {
"field": "major_num",
"size": 10
},
"aggs": {
"top_hit": {
"top_hits": {
"size": 1
}
}
}
}
}
}
}
}