2016-09-29 152 views
1

我想對某個查詢應用某種排序,它應該先按照一個值對所有其他文檔排序。我需要在MySQL中實現類似ORDER BY CASE的功能,但我無法找到如何執行的操作。Elasticsearch首先按某個字段值排序

在彈性的索引中的每個元件具有以下結構:

{ 
    "id": 123, 
    "name": "Title", 
    "categories": ["A", "B", "C"], 
    "price": 100, 
    "city": "London", 
    "country": "United Kingdom", 
    "status": 1 
} 

我做以下查詢:

{ 
    "fields": [], 
    "sort": [{"price": {"order": "asc"}}], 
    "size": 0, 
    "query": { 
     "query_string": { 
      "query": "status:1 AND country:'United Kingdom'" 
     } 
    }, 
    "aggs": { 
     "id": { 
      "terms": { 
       "field": "id", 
       "size": 10 
      } 
     } 
    } 
} 

所以通過首先用值「利物浦」排序列city並考慮下面的例子:

{"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 } 

我希望有outpu t以下ID:3,1,2。

如何更改我的查詢以獲取此行爲?

UPDATE:該版本是1.7.2

+0

什麼是您的案例中的「按時間排序」? – Val

+0

你終於找到了解決方案嗎? –

回答

0

實際上要通過城市排序第一,然後通過價格是多少? 關鍵點是「城市」字段的類型,它是字符串(也許你設置了分析?)不是整數。所以,如果你設置上提交的「城市」進行分析,你最好添加一個屬性命名「原始」,而不分析,那麼你可以通過「城市排序:第一

嘗試以下操作:

"sort": [{"city.raw": {"order": "asc"}},{"price": {"order": "asc"}}], 

您可以訪問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更多的幫助。

0

您應該使用"_script"爲1.7版本。試試這個:

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" 
} 

對於elasticsearch的最新版本(> = 5.5)檢查this doc