2016-03-02 2 views
3

У меня есть следующая структура в индексируемых документах:Elasticsearch сортировки путем сопоставления элемента массива

document1: "customLists":[{"id":8,"position":8},{"id":26,"position":2}] 
document2: "customLists":[{"id":26,"position":1}] 
document3: "customLists":[{"id":8,"position":1},{"id":26,"position":3}] 

Я могу найти соответствующие документы, которые принадлежат к данному списку с запросом матча «customLists.id = 26». Но мне нужно отсортировать документы на основе значения позиции внутри этого списка и игнорировать позиции других списков.

Так что ожидаемые результаты будут в порядке документ2, документа1, document3

ли структура данных подходит для этого вида сортировки и как справиться с этим?

+0

Что 'игнорировать позиции других lists.' значит в вашем вопросе? – Richa

+0

если я ищу с customLists.id = 26 Меня интересует только значение позиции в этом элементе {"id": 26, "position": 5} –

+0

Невозможно понять вас. Пожалуйста, поделитесь выводом, который вы хотите? – Richa

ответ

4

Одним из способов для достижения этой цели было бы установить тип отображения из customLists в nested, а затем использовать сортировку по nested fields

Пример:

1) Создание индекса & Mapping

put test 
put test/test/_mapping 
{ 
    "properties": { 
     "customLists": { 
     "type": "nested", 
     "properties": { 
      "id": { 
       "type": "integer" 
      }, 
      "position": { 
       "type": "integer" 
      } 
     } 
     } 
    } 
} 

2) Индексные документы:

put test/test/1 
    { 
    "customLists":[{"id":8,"position":8},{"id":26,"position":2}] 
    } 
    put test/test/2 
    { 
    "customLists":[{"id":26,"position":1}] 
    } 

    put test/test/3 
    { 
     "customLists":[{"id":8,"position":1},{"id":26,"position":3}] 
    } 

3) Запрос на сортировку positon для данного идентификатора

post test/_search 
    { 
     "filter": { 
      "nested": { 
      "path": "customLists", 
      "query": { 
       "term": { 
        "customLists.id": { 
         "value": "26" 
        } 
       } 
      } 
      } 
     }, 
     "sort": [ 
      { 
      "customLists.position": { 
       "order": "asc", 
       "mode": "min", 
       "nested_filter": { 
        "term": { 
         "customLists.id": { 
         "value": "26" 
         } 
        } 
       } 
      } 
      } 
     ] 
    } 
Смежные вопросы