2016-09-29 5 views
1

Я хотел бы применить определенный запрос к запросу, он должен сначала отсортировать мои документы по одному значению, а затем по всем остальным. Мне нужно добиться чего-то вроде ORDER BY CASE WHEN в MySQL, но я не мог найти, как это сделать.Порядок 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 
      } 
     } 
    } 
} 

So путем сортировки столбца 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 } 

Я ожидаю, что в качестве авангара t следующий идентификатор: 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.

Смежные вопросы