Elasticsearch 先按某个字段值排序

Fab*_*hia 7 elasticsearch

我想对查询应用某种排序,它应该先按单个值对我的文档进行排序,然后再按所有其他值排序。我需要在 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),请查看此文档


Gen*_*e Y 1

实际上您想先按城市排序,然后按价格排序?关键点是“城市”字段的类型,它是字符串(也许您设置了分析?)而不是整数。因此,如果您在“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获取更多帮助。