2016-08-09 3 views
1

Я пытаюсь создать булев фильтр в ElasticSearch, который проверяет start_date и end_date по сравнению с сегодня. Если start_date или end_date равно null, результат должен быть возвращен.Elasticsearch - Bool фильтр диапазон дат или поле может быть NUL

Так, например, сегодня 2016-08-09.

  • Пункт 1: start_date: 2016-08-04 end_date: 2016-08-08 НЕ ДОЛЖНЫ ВЕРНУТЬ
  • Пункт 2: start_date: 2016-08-08 end_date: 2016- 08-12 НЕОБХОДИМО ВЕРНУТЬ
  • Пункт 3: start_date: нуль end_date: нуль НЕОБХОДИМО ВЕРНУТЬ

Не похоже, чтобы заставить его работать с моим текущим кодом:

POST _search 
{ 
"query":{ 
    "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter" : { 
      "bool": { 
       "must": [{ 
        "range": { 
         "start_date": {"lte": "2016-08-09"}   
        } 
       }, 
       { 
        "range": { 
         "end_date": {"gte": "2016-08-09"}  
        } 
       }], 
       "should": [{ 
        "missing": { 
         "field": "start_date"   
        } 
       }, 
       { 
        "missing": { 
         "field": "end_date"  
        } 
       }] 
      } 
     } 
    } 
} 
} 

ответ

2

Вы, наверное, нужно что-то вроде этого, а именно:

  • start_date должен быть либо пустым или до сегодняшнего дня
  • end_date должно быть либо null, либо после сегодняшнего дня

Исправленный запрос:

POST _search 
{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "bool": { 
       "should": [ 
        { 
        "range": { 
         "start_date": { 
         "lte": "now" 
         } 
        } 
        }, 
        { 
        "missing": { 
         "field": "start_date" 
        } 
        } 
       ] 
       } 
      }, 
      { 
       "bool": { 
       "should": [ 
        { 
        "range": { 
         "end_date": { 
         "gte": "now" 
         } 
        } 
        }, 
        { 
        "missing": { 
         "field": "end_date" 
        } 
        } 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

Спасибо, Val, это работает! – Paul

+0

Удивительный, рад, что это помогло! – Val

0

Похоже, что вам нужно следующий запрос:

(start_date <= date AND date <= end_date) OR (start_date == null) OR (end_date == null)

Следуя примеру в elasticsearch documentation, я хотел бы написать следующее условие:

"bool": { 
    "should": [ 
     {"bool": 
      "must": [{ 
       "range": { 
        "start_date": { 
         "lte": "2016-08-09" 
        } 
       } 
      }, 
      { 
       "range": { 
        "end_date": { 
         "gte": "2016-08-09" 
        } 
       } 
      }] 
     }, 
     "missing": { 
      "field": "start_date" 
     }, 
     "missing": { 
      "field": "end_date" 
     } 
    ] 
} 

Если это не сработало точно так же, как написано, я попытался бы увидеть, работает ли каждая часть предложения should (т. е. дата находится внутри диапазона, start_date нет, end_date нет), выполняя запросы с этими отдельными частями. Если все они работают, их объединение внутри should тоже должно работать.

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