2015-04-27 3 views
1

У нас есть документы с (упрощенной) структуры, как показано здесь, в Elasticsearch:Join/Объединить Elasticsearch результаты

{ _id: ..., patientId: 4711, text: "blue" } 
{ _id: ..., patientId: 4711, text: "red" } 
{ _id: ..., patientId: 4712, text: "blue" } 
{ _id: ..., patientId: 4712, text: "green" } 
{ ... } 

Как я могу создать запрос, чтобы найти все документы, содержащие текст blue и red в пределах Те же пациент.

В приведенном выше примере я ожидаю, что итоговый набор из двух документов с patientId 4711 (содержит blue и red).

Потенциальные стратегии решения могут быть:

  • Выполнить два запроса и «Join» результаты позже с помощью логики приложения.
  • Выполнение отдельных запросов на основе предыдущего списка пациентов. Только возможно, если число потенциальных пациентов невелико.

Есть ли лучшие способы (идеальный один запрос) для обработки этого прецедента?

ответ

0

Вы можете просто использовать bool query или bool filter

Пример использования BOOL фильтр

{ 
    "filtered" : { 
     "query" : { 
      "match_all" : { } 
     }, 
     "filter" : { 
      "bool" : { 


       "Must" : [ 
        { 
         "term" : { "text" : "blue" } 
        }, 
        { 
         "term" : { "text" : "red" } 
        } 
       ] 
      } 
     } 
    } 
} 

Редактировать: неверно истолковали требование:

Вы должны использовать field collapsing

+0

Не уверен, что ответы вопрос ОП, поскольку это будет работать только там, где существовало бы в том же документе, не так ли? – samjudson

+0

Нет, это, к сожалению, не работает. Задача состоит в том, что термины не существуют в одном документе. – user3218367

+0

Я неправильно понял вопрос, поэтому обновил ответ, чтобы проверить http://www.elastic.co/guide/en/elasticsearch/guide/current/top-hits.html –

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