2017-01-25 3 views
0

Я использую ES 2.3 и есть запрос, в котором filter секция выглядит следующим образом:Elasticsearch: выполнить фильтр на вложенном документе, только если он существует

"filter": { 
    "query": { 
     "bool": { 
     "must": [ 
      { 
      "nested": { 
       "path": "employees", 
       "query": { 
       "bool": { 
        "must": [ 
        { 
         "range": { 
         "employees.max_age": { 
          "lte": 50 
         } 
         } 
        }, 
        { 
         "range": { 
         "employees.min_age": { 
          "gte": 20 
         } 
         } 
        } 
        ] 
       } 
       } 
      } 
      }, 
      { 
      "exists": { 
       "field": "employees" 
      } 
      }, 
      { 
      #....other filter here based on root document, not on nested employee document 
      } 
     ] 
     } 
    } 
    } 
} 

У меня есть фильтр, где я проверить некоторые условия в вложенный документ «сотрудники» в более крупном документе, называемом компанией, но я хочу запустить этот фильтр, только если существует объект «employee», так как некоторые из документов могут вообще не иметь этого вложенного документа. Поэтому я добавил, {"exists": {"field": "employees"}} , но это не работает. Подумайте, какое изменение я должен внести, чтобы заставить его работать?

+0

Вы должны переместить 'exists' запрос внутри' nested' запрос и он будет работать – Val

+0

@Val пожалуйста, вы можете показать мне, где я должен точно поставить его? – JVK

+0

Также, если вы поместили его внутри 'inested', то вы уже предполагаете, что вложенный уже существует, тогда только он пройдет? – JVK

ответ

0

Вы можете сделать это вот так. Однако, если в документах нет поля employees, они все равно не будут подняты, поэтому я не уверен, зачем вам нужен или нужен этот запрос exists.

{ 
    "filter": { 
    "query": { 
     "bool": { 
     "must": [ 
      { 
      "nested": { 
       "path": "employees", 
       "query": { 
       "exists": { 
        "field": "employees" 
       } 
       } 
      } 
      }, 
      { 
      "nested": { 
       "path": "employees", 
       "query": { 
       "bool": { 
        "must": [ 
        { 
         "range": { 
         "employees.max_age": { 
          "lte": 50 
         } 
         } 
        }, 
        { 
         "range": { 
         "employees.min_age": { 
          "gte": 20 
         } 
         } 
        } 
        ] 
       } 
       } 
      } 
      } 
     ] 
     } 
    } 
    } 
} 
+0

Спасибо @val Я попробую это и дам вам знать. Что касается «Однако, если в документах нет поля сотрудников, они все равно не будут подняты, поэтому я не уверен, почему вы хотите/нуждаетесь в том, что существует запрос в первую очередь». - Потому что я хочу включить эти документы, даже если «сотрудники» не существуют. То, что я хотел, было тогда и только тогда, когда существуют «служащие», а затем запускается только фильтр. – JVK

+0

В этом случае это зависит от того, как выглядит ваш общий запрос, посмотрим. – Val

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