gpt4 book ai didi

php - ElasticSearch,如何按其他字段排序聚合?

转载 作者:行者123 更新时间:2023-11-29 18:51:46 32 4
gpt4 key购买 nike

我有一个问答项目,我想在名为 Feed 的部分中实现 Elasticsearch。

此部分是一种最后的事件提要。

这是 Feed 表:

id | question_id | user_id | action_type  | date_added
---------------------------------------------------------------
26 | 29 | 32 | new_answer | 2017-04-22 18:34:56
36 | 38 | 35 | new_answer | 2017-04-24 19:42:40
5 | 52 | 25 | new_question | 2017-04-03 16:28:43
2 | 52 | 20 | new_answer | 2017-05-05 13:22:41

因此,使用 Elasticsearch,我不想获取按 Question_id 分组并按 id DESC 排序的数据。

所以我这样做了:

{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"questions": {
"terms": {
"field": "question.id",
"order": {
"_term": "desc"
}
}
}
}
}

我得到这个结果:

{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 41,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"questions" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 10,
"buckets" : [ {
"key" : "64",
"doc_count" : 4
}, {
"key" : "63",
"doc_count" : 5
}, {
"key" : "62",
"doc_count" : 4
}, {
"key" : "61",
"doc_count" : 5
}, {
"key" : "60",
"doc_count" : 1
}, {
"key" : "59",
"doc_count" : 1
}, {
"key" : "58",
"doc_count" : 3
}, {
"key" : "57",
"doc_count" : 3
}, {
"key" : "56",
"doc_count" : 3
}, {
"key" : "55",
"doc_count" : 2
} ]
}
}
}

如何获取按 iddate_added 排序的问题

谢谢

最佳答案

您可以通过 question_id 将文档分组到存储桶中并在每个存储桶中按 id 排序或date_added使用top hits子聚合。

下面是一个基于聚合的示例,并按 id 对每个存储桶中的文档进行排序。按降序排列:

{
"size": 0,
"aggs": {
"questions": {
"terms": {
"field": "question_id",
"order": {
"_term": "desc"
}
},
"aggs": {
"question_docs": {
"top_hits": {
"size": 10,
"sort": [
{
"id": {
"order": "desc"
}
}
]
}
}
}
}
}
}

假设您的映射为 date_added指定date字段数据类型,那么你也可以替换 date_added对于 idtop_hits聚合。如果您让 Elasticsearch 为您确定映射,则您的日期可能会存储为 text (对于 Elasticsearch 5.x)或 string (5.x 之前的任何版本)。我使用带有动态映射的 Elasticsearch 5.4 索引了您问题中的示例数据;它将日期的映射设置为 text (对于全文搜索,使用 date_added 访问)和 keyword (用于排序和聚合,使用 date_added.keyword 访问)。

您可以使用get mapping API查看索引的映射。例如,查看索引 <index_name> 的映射,使用以下内容:

curl -XGET "http://localhost:9200/<index_name>/_mapping"

关于php - ElasticSearch,如何按其他字段排序聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44335287/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com