【发布时间】:2017-10-01 13:20:21
【问题描述】:
我正在尝试将旧 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
}
我使用的是 elastic 2.3,但如果真的有必要,我可以升级。
【问题讨论】:
-
您能详细说明为什么您尝试的查询不能满足您的要求吗?没有仔细看(测试一些东西),但第一次阅读它似乎是正确的......
-
我在当前查询中看到的问题是您无法按用户的 6 个最佳分数之和对用户进行排序,即对于每个用户,您可以获得 6 个最佳分数,但您不能根据它们的总和对它们进行排名。对吗?
-
实际上你有一个小错误(不是格式错误),但功能。第二个聚合应该是第一个聚合的子聚合。
-
平心而论,@AndreiStefan 不是我发现了查询中的错误 :-)
-
@Val 也会发现这一点,我敢肯定 :-)。