2016-12-27 9 views
0

Рассмотрим ниже Стоп-поле - это поле метки времени.ElasticSearch 5. *, запрос для: поля не существует или если существует значение должно быть

я хочу, чтобы фильтровать данные с ниже условия:

  1. остановка поле не существует
  2. или остановить значение поля> = Теперь

Я знаю, я должен использовать must_not, но не может выяснить как.

Я хочу сделать некоторый подсчет по типу child и использовать этот счет для сортировки родительского элемента, а затем отфильтровать родителя с помощью поля остановки.

GET indexName/parentType/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "has_child": { 
      "type": "child-type", 
      "score_mode": "max", 
      "query": { 
       "function_score": { 
       "functions": [ 
        { 
        "script_score": { 
         "script": { 
         "file": "score-analytics", 
         "lang": "expression" 
         } 
        } 
        } 
       ] 
       } 
      } 
      } 
     }, 
     { 
      "bool": { 
      "should": [ 
       { 
       "range": { 
        "stop": { 
        "gte": "now" 
        } 
       } 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Я получаю желаемый результат с фильтром ниже, но все еще ищу кое-что лучше. { "BOOL": { "должен": [{ "Диапазон": { "стоп": { "GTE": "теперь"}}}, { "BOOL": { "must_not": [{ "существует": { «field»: «stop»}}]}}]}} –

+1

Запрос в вашем комментарии - именно тот, который вам нужен. Вам также нужно добавить '" minimum_should_match ": 1' – Val

ответ

0

Вы должны использовать такие фильтры:

"bool": 
     { "should":[ 
     { "range": 
      { "stop": 
       { "gte": "now" } 
      } 
     }, 
     { "query": 
      { "exists" : 
       { "field" : "stop" } 
      } 
      } 
] } 
0

Что делать, если вы используете, must_notbool условие для того, чтобы отфильтровать, что поле не существует. Ваш запрос может выглядеть примерно так:

"query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must_not": [ 
      { 
       "exists": { 
       "field": "stop" <-- give the field which shouldn't exist 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 

Вышеприведенный образец, чтобы вы могли воспроизводить. Для второго условия кажется, что с помощью range запрос, как вы это сделали, сделает. Я не могу в значительной степени обеспечить лучший способ получить временную отметку range. Надеюсь, поможет!

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

  • Нет связанных вопросов^_^