作者:鱼影沫1457 | 来源:互联网 | 2023-02-04 20:44
我正在尝试将旧MySQL数据库的一些查询迁移到我们新的Elasticsearch设置中.数据有点复杂,但归结为以下几点:
我有一个包含很多分数的索引.每个分数代表玩家在特定游戏中得分.
{
"userId": 2,
"scoreId": 3457,
"game": {
"id": 6,
"name": "scrabble"
},
"date": 1340047100,
"score": 56,
// and more game data
}
scoreId
是这个分数的唯一ID,game.id
是该类型游戏的ID.
{
"userId": 6,
"gameId": 3479,
"game": {
"id": 5,
"name": "risk"
},
"date": "1380067200",
"score": 100,
// and more game data
}
多年来,我们玩了许多不同的游戏,我想为每种类型的游戏排名最好的玩家.排名基于每位玩家的最佳6场比赛.因此,例如,如果玩家玩拼字游戏10次,则只有6个最佳分数计入其总分.
我想创建一个列表,如:
// Scrabble ranking:
# | user | total points
1 | 2 | 4500
2 | 6 | 3200
2 | 23 | 1500
迁移的原因是旧的MySQL查询首先获得每个游戏的所有不同用户的列表,然后为每个用户执行另一个查询以获得其最佳的6个分数.我希望我可以使用弹性聚合在一个查询中完成所有操作,但到目前为止我无法使其工作.
问题是,经过几个小时的阅读弹性文档后,似乎我的问题比例子更复杂.也许如果有人能指出我正确的方向,我可以继续我的搜索.至少这不是让我在任何地方:
GET /my-index/scores/_search
{
"query": {
"bool": {
"filter": [
{"term": { "game.id": 6 }}
]
}
},
"aggs": {
"scores": {
"terms": {
"field": "userId"
}
},
"top_scores_user": {
"top_hits": {
"sort": [{
"score": {
"order": "desc"
}
}],
"size" : 6
}
}
},
"size": 0
}
我正在使用弹性2.3,但如果真的有必要,我有机会升级.