我想对查询应用某种排序,它应该先按单个值对我的文档进行排序,然后再按所有其他值排序。我需要在 MySQL 中实现类似 ORDER BY CASE WHEN 的东西,但我找不到如何去做。
Elastic 中索引中的每个元素都具有以下结构:
{
"id": 123,
"name": "Title",
"categories": ["A", "B", "C"],
"price": 100,
"city": "London",
"country": "United Kingdom",
"status": 1
}
Run Code Online (Sandbox Code Playgroud)
我执行以下查询:
{
"fields": [],
"sort": [{"price": {"order": "asc"}}],
"size": 0,
"query": {
"query_string": {
"query": "status:1 AND country:'United Kingdom'"
}
},
"aggs": {
"id": {
"terms": {
"field": "id",
"size": 10
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,首先对city值为“Liverpool”的列进行排序并考虑以下示例:
{"id": 1, "name": "Test", "categories": ["A", "B", "C"], "price": 100, "city": "London", "country": "United Kingdom", "status": 1 }
{"id": 2, "name": "Sample", "categories": ["A", "D", "F"], "price": 200, "city": "Manchester", "country": "United Kingdom", "status": 1 }
{"id": 3, "name": "Title", "categories": ["X", "Y", "Z"], "price": 1000, "city": "Liverpool", "country": "United Kingdom", "status": 1 }
Run Code Online (Sandbox Code Playgroud)
我希望输出以下 ID:3、1、2。
如何更改我的查询以获得此行为?
更新:版本是 1.7.2
小智 7
对于 1.7 版本,您应该使用“_script”。尝试这个:
1.7:
"query" : {
....
},
"sort" : {
"_script" : {
"script" : "doc['city'].value == 'Liverpool' ? 1 : 0",
"type" : "number",
"order" : "desc"
},
"example_other_field_order":"asc",
"next_example_field_order":"asc"
}
Run Code Online (Sandbox Code Playgroud)
对于最新版本的 elasticsearch (>= 5.5),请查看此文档。
实际上您想先按城市排序,然后按价格排序?关键点是“城市”字段的类型,它是字符串(也许您设置了分析?)而不是整数。因此,如果您在“city”字段上设置了analyze,则最好添加一个名为“raw”的属性而不进行analyze,然后您可以按“city:first”排序。
请尝试以下操作:
"sort": [{"city.raw": {"order": "asc"}},{"price": {"order": "asc"}}],
Run Code Online (Sandbox Code Playgroud)
您可以访问https://www.elastic.co/guide/en/elasticsearch/guide/current/multi-fields.html获取更多帮助。
否则,如果您在搜索和排序时只需要先将“利物浦”城市放在第一位,然后再进行其他城市,则应在查询中使用增强功能。请访问https://www.elastic.co/guide/en/elasticsearch/guide/2.x/multi-query-strings.html获取更多帮助。
| 归档时间: |
|
| 查看次数: |
8642 次 |
| 最近记录: |