我正在尝试按搜索查询 Elasticsearch 中的 top_hits 参数对数据进行排序,但不知何故它没有影响任何内容。谁能帮我解决这个问题吗?
所以我尝试使用排序,就像有些人这样说的:
{
"size" : 0,
"from" : 0,
"aggs": {
"by_filter": {
"filter": {
"bool": {
"must": [
{
"range": {
"published_at": {
"gte": "2019-08-01 00:00:00",
"lte": "2023-10-30 23:59:59"
}
}
},
{
"match": {
"status": "published"
}
}
]
}
},
"aggs": {
"by_created": {
"terms": {
"field": "created_by.id",
"size": 10
},
"aggs" : {
"count_data": {
"terms": {
"field": "created_by.id"
}
},
"hits": {
"top_hits": {
"sort": [ <---- the sort query that I found
{
"created_by.id": {
"order": "desc"
}
}
],
"_source":["created_by.id"],
"size": 1
}
}
}
}
}
}
}
}
但结果没有改变:
"aggregations": {
"by_filter": {
"doc_count": 21,
"by_created": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 3,
"buckets": [
{
"key": 34,
"doc_count": 3,
"hits": {
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "re_article",
"_id": "53822",
"_score": null,
"_source": {
"created_by": {
"id": 34
}
},
"sort": [ <--- I think this is the result of the sort
34
]
}
]
}
},
"count_data": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 34,
"doc_count": 3
}
]
}
},
{
"key": 52,
"doc_count": 3,
"hits": {
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "re_article",
"_id": "338610",
"_score": null,
"_source": {
"created_by": {
"id": 52
}
},
"sort": [
52
]
}
]
}
},
"count_data": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 52,
"doc_count": 3
}
]
}
}
]
}
}
}
我期望的是存储桶先显示键 52,然后显示键 34,如下所示:
"aggregations": {
"by_filter": {
"doc_count": 21,
"by_created": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 3,
"buckets": [
{
"key": 52,
"doc_count": 3,
"hits": {
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "re_article",
"_id": "338610",
"_score": null,
"_source": {
"created_by": {
"id": 52
}
}
}
]
}
},
"count_data": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 52,
"doc_count": 3
}
]
}
},
{
"key": 34,
"doc_count": 3,
"hits": {
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "re_article",
"_id": "53822",
"_score": null,
"_source": {
"created_by": {
"id": 34
}
}
}
]
}
},
"count_data": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 34,
"doc_count": 3
}
]
}
}
]
}
}
}
我认为我选择了一个错误的例子,因为 top_hits 结果中有新的“排序”字段,但并不是我真正想要的
你已经很接近了,你只需要将
"order"
移动到你真正想要排序的聚合并稍微改变一下语法。 "order"
中的 top_hits
将对 hits
进行排序,如果您想对 by_created
聚合中的键进行排序,则需要将 "order"
添加到该聚合中:
{
"size" : 0,
"from" : 0,
"aggs": {
"by_filter": {
"filter": {
"bool": {
"must": [
{
"range": {
"published_at": {
"gte": "2019-08-01 00:00:00",
"lte": "2023-10-30 23:59:59"
}
}
},
{
"match": {
"status": "published"
}
}
]
}
},
"aggs": {
"by_created": {
"terms": {
"field": "created_by.id",
"size": 10,
"order": { <--- try applying it here
"_key": "desc"
}
},
"aggs" : {
"count_data": {
"terms": {
"field": "created_by.id"
}
},
"hits": {
"top_hits": {
"sort": [ <---- the sort query that I found
{
"created_by.id": {
"order": "desc"
}
}
],
"_source":["created_by.id"],
"size": 1
}
}
}
}
}
}
}
}
terms
聚合文档中找到更多选项。如果您需要对其他聚合进行排序,您可能会发现bucket_sort
聚合很有用。