我有Q& A项目,我想在名为Feed的部分中实现Elasticsearch。
此部分是一种最后一项活动Feed。
这是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
} ]
}
}
}
如何通过questions
或id
订购date_added
?
由于
答案 0 :(得分:0)
您可以按question_id
将文档分组到存储桶中,并使用top hits子聚合在id
或date_added
内对每个存储桶进行排序。
以下是基于您的聚合构建的示例,并按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
替换为id
聚合中的top_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"