2017-01-09 2 views
0

У меня есть поле (скажем, цвет), которое может иметь одно из четырех значений (красный, синий, желтый и зеленый). Я хочу сортировать их так, чтобы у красного было 1 балл, так что все красные будут на вершине, а затем синий с партией 2, желтый со счетом 3 и так далее.Elasticsearch явный порядок сортировки

Как назначить этот ручной подсчет для сортировки в elasticsearch?

+0

Пожалуйста, покажите нам свои сопоставления, запросы, исключения, которые вы пробовали до сих пор. – user3775217

ответ

1

Вы можете использовать функцию function_score, которая будет предоставлять пользовательские функции подсчета очков. Вы можете заменить запрос match_all тем, который вам нужен.

{ 
    "query": { 
    "function_score": { 
     "boost_mode": "replace", 
     "query": { 
     "match_all": {} 
     }, 
     "functions": [ 
     { 
      "filter": { 
      "term": { 
       "color": "red" 
      } 
      }, 
      "weight": 1 
     }, 
     { 
      "filter": { 
      "term": { 
       "color": "blue" 
      } 
      }, 
      "weight": 3 
     }, 
     { 
      "filter": { 
      "term": { 
       "color": "yellow" 
      } 
      }, 
      "weight": 2 
     } 
     ] 
    } 
    }, 
    "size": 20, 
    "from": 0 
} 
+0

Это хорошо, но мне удалось добиться того же, добавив поля сортировки при индексировании ... поэтому doc содержит поле colorScore со счетом 1, 2 или 3, тогда я просто использую те, которые сортируются. – Marconi

+0

Да, это просто другой подход, время индексирования или время запроса. – Mysterion

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