2016-02-18 5 views
1

Я хотел бы отсортировать документы на основе вложенных атрибутов. Учитывая У меня есть следующие документы:Сортировка документов на основе коллекции вложенных объектов

{ 
    "id": 1, 
    "attributes": [ 
     { 
      "name": "a", 
      "value": 1 
     }, 
     { 
      "name": "b", 
      "value": 2 
     } 
    ] 
} 

{ 
    "id": 2, 
    "attributes": [ 
     { 
      "name": "a", 
      "value": 2 
     }, 
     { 
      "name": "b", 
      "value": 2 
     } 
    ] 
} 

{ 
    "id": 3, 
    "attributes": [ 
     { 
      "name": "b", 
      "value": 1 
     } 
    ] 
} 

Сортировку следует сравнить значения одних и тех же атрибутов, поэтому он должен первым идти вперед и сравнение значения атрибута «а».

Если значения группы «a» совпадают, тогда следует перейти и сравнить атрибут «b».

Если вся группа отсутствует, документ, отсутствующий в атрибуте, должен потерять сравнение.

Атрибуты могут иметь любые имена и значения, поэтому заранее не известны имена атрибутов.

Я написал этот алгоритм в своем клиентском приложении, мне просто нужен способ сделать это с помощью ElasticSearch.

+0

Вы знаете что-нибудь о количестве атрибутов? И как вы определяете порядок, в котором учитывается каждый атрибут? –

+0

Я не знаю, сколько атрибутов есть заранее. Порядок сравнения атрибутов должен быть в алфавитном порядке по имени атрибутов. –

+1

Тогда я не думаю, что вы можете сделать это с помощью ES. –

ответ

0

Вы можете попробовать сделать это в двух запросах. Ни одно из приведенных ниже испытаний не проверено, оно просто предназначено для того, чтобы дать вам направление для рассмотрения.

Первый запрос является агрегация, чтобы получить четкий список attribute.name

Второй содержит ваш фактический запрос, с чем-то вроде следующего за sort (вы должны построить этот вид, основываясь на результатах работы выше agg)

{ 
    "query": {"match_all": {}}, 
    "sort": [ 
     { 
      "attributes.value": { 
       "nested_path": "attributes", 
       "nested_filter": {"term": {"attributes.name": "a"}} 
      } 
     }, 
     { 
      "attributes.value": { 
       "nested_path": "attributes", 
       "nested_filter": {"term": {"attributes.name": "b"}} 
      } 
     }, 
     ... 
    ] 
} 
Смежные вопросы