如果我想从按评级排序的弹性中获取驱动程序数据,其中评级可能是["good", "ok", "bad"],如何编写查询以帮助我按好 > 正常 > 差的顺序获取数据
["good", "ok", "bad"]
排序后的响应列表:
[{ "name": "driver1", "rating": "good" }, { "name": "driver3", "rating": "good" }, { "name": "driver2", "rating": "ok" }, { "name": "driver4", "rating": "bad" }]
要从 Elasticsearch 中按 ["good", "ok", "bad"] 的自定义顺序排序驱动程序数据,可以使用一种称为 脚本排序 的方法。以下是一个示例查询,它通过 script_score 设置自定义排序顺序:
script_score
GET /drivers/_search { "query": { "function_score": { "query": { "match_all": {} }, "functions": [ { "script_score": { "script": { "source": """ def rating_order = ['good': 3, 'ok': 2, 'bad': 1]; return rating_order.containsKey(doc['rating.keyword'].value) ? rating_order[doc['rating.keyword'].value] : 0; """ } } } ], "boost_mode": "replace" } }, "sort": [ { "_score": { "order": "desc" } } ] }
rating_order
good
ok
bad
使用 doc['rating.keyword'].value 获取文档的 rating 值并映射到上述权重。如果值不存在,则默认权重为 0。
doc['rating.keyword'].value
rating
0
排序方式:
在 sort 部分按 _score 值降序排列。
sort
_score
示例结果: 响应将按 good > ok > bad 的顺序排序。
keyword
.keyword
如果数据规模较大,建议在索引时添加自定义字段,例如 rating_score,直接将数值存储为 3、2 和 1,并在查询时按该字段排序以提高性能。
rating_score
3
2
1