2015-11-30 2 views
1

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

 "filter" : { 
     "bool" : { 
      "must" : [ { 
       "term" : { "channel" : "24" } 
      }, 
      { 
       "range" : { 
       "startTime" : { "gt" : "now" } 
       } 
      }] 
     } 
    } 

ElasticSearch фильтрует все документы, которые имеют канал 24, но я также хочу, чтобы все другие документы, которые не имеют канал атрибута. Например, мой запрос должен включать всех участников (doc не имеет канала свойств и startTime), фильмы (doc не имеет канала свойств и startTime), жанры (doc не имеет канала свойств и startTime) и tv показывает/программы (doc имеет канал свойств и startTime), что воздух на канале 24.

Есть ли способ сделать это без участия сценария фильтра? Я мог бы достичь этого, используя скрипт, но тогда производительность запроса будет очень плохим.

Спасибо Тьяго

ответ

2

Попробуйте это:

POST /test_index/_search 
{ 
    "filter": { 
     "bool": { 
     "should": [ 
      { 
       "bool": { 
        "must": [ 
        { 
         "term": { 
          "channel": "24" 
         } 
        }, 
        { 
         "range": { 
          "startTime": { 
           "gt": "now" 
          } 
         } 
        } 
        ] 
       } 
      }, 
      { 
       "bool": { 
        "must_not": [ 
        { 
         "exists": { 
          "field": "channel" 
         } 
        }, 
        { 
         "exists": { 
          "field": "startTime" 
         } 
        } 
        ] 
       } 
      } 
     ] 
     } 
    } 
} 
+0

Hi @Sloan, он не работал. Я запустил фильтр против индекса, содержащего телевизионные шоу/программы, и не возвратил какой-либо документ. – Thiago

+0

Это будет довольно сложно диагностировать проблему, если вы не можете предоставить некоторые данные примера. В идеале, данные должны быть упрощены, чтобы сохранить суть вашей проблемы, но не полон посторонних вещей, и все еще достаточно разнообразны, чтобы дать понять, что вы ожидаете получить, а что нет. Возможно, вы захотите добавить его в суть или что-то еще. –

+0

Если вы можете предоставить данные, уже упакованные в массовый запрос (что-то вроде [this] (http://sense.qbox.io/gist/d5625c80946f332718b0fa166bba27efd264b76e)), еще лучше. –

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