2015-07-06 3 views
1

Я работаю над интеграцией elasticsearch в приложение, которое мы строим. У меня возникают проблемы с вложенными запросами и фильтрами. Вот пример нашего отображения:Объединение фильтра и запроса whitin вложенного документа в elasticsearch

"index": { 
    "mappings": { 
     "users": { 
      "properties": { 
       "membership": { 
        "type": "nested", 
        "properties": { 
         "membership": { 
          "type": "string" 
         }, 
         "start date": { 
          "type": "date" 
         }, 
         "end date date": { 
          "type": "date" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Теперь я хочу, чтобы найти всех пользователей с «членство» «Foo бар», без EndDate. Проблема в том, что, когда я использую стандартный анализатор, «foo bar» разбивается на два слова в индексе, поэтому я не могу использовать фильтр терминов для поиска «foo bar». Мы можем решить это, используя другой анализатор, но это имеет и другие недостатки, такие как проблемы с верхними/нижними шкафами и т. Д.

Кроме того: довольно легко найти всех с членством «foo bar», используя запрос вместо фильтр. Проблема в том, что нет запроса на поиск вложенных документов с «Конечной датой» = отсутствует. Для этого есть фильтр, но я не могу совместить запрос «membership» = «foo bar» с фильтром «дата окончания» = отсутствует в одном и том же вложенном документе.

Итак, я могу найти всех с «конечной датой» = отсутствует, и я могу найти всех с членством «foo bar», но не у всех без конечной даты, специально для членства «foo bar».

Есть ли какие-либо предложения по решению этой проблемы?

ответ

1

Это, кажется, сделать это:

POST /test_index/_search 
{ 
    "query": { 
     "nested": { 
     "path": "membership", 
     "query": { 
      "bool": { 
       "must": [ 
        { 
        "match": { 
         "membership.membership": { 
          "query": "foo bar", 
          "operator": "and" 
         } 
        } 
        }, 
        { 
        "filtered": { 
         "filter": { 
          "not": { 
           "filter": { 
           "exists": { 
            "field": "membership.end_date" 
           } 
           } 
          } 
         } 
        } 
        } 
       ] 
      } 
     } 
     } 
    } 
} 

Вот код, который я использовал, чтобы установить его (ES 1.5.1):

http://sense.qbox.io/gist/20a12a71178f0aac4369f52ab0c4c811ba803122

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