2016-09-29 38 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