2016-02-10 3 views
0

У меня возникли проблемы с записью запроса для запроса пользователей с активными событиями.Устранение неполадок с вычислением вложенных запросов и дат Elasticsearch

Краткая настройка У меня есть пользователи, у которых есть события с датами начала и окончания. Учитывая определенную дату, мне нужно знать, какие пользователи НЕ имеют активных событий в этот день. События индексируются как вложенные объекты, так как у них есть свои собственные модели.

Так вот некоторые данные

[ 
    { 
    id: 1 
    name: 'MyUser', 
    events :[ 
     { id: 1, start: 02/01/2016, end: 02/05/2016 }, 
     { id: 2, start: 02/09/2016, end: 02/10/2016 }, 
    ] 
    }, 
    { 
    id: 2 
    name: 'MyUser2', 
    events :[ 
     { id: 3, start: 02/02/2016, end: 02/04/2016 }, 
    ] 
    }, 
    { 
    id: 3 
    name: 'MyUser3', 
    events :[ 
    ] 
    } 
] 

карта выглядит следующим образом

'events' => [ 
      'type'=>'nested', 
      'properties'=>[ 
       'start'=>[ 
        'type' => 'date', 
        "format"=> "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd" 
       ], 
       'end'=>[ 
        'type' => 'date', 
        "format"=> "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd" 
       ] 
      ] 
     ], 

Таким образом, для примера запроса 02/08/2016, мне нужно, чтобы показать всем пользователям бесплатно, 02/04/2016 только пользователь 3 и 02/08/2016 только пользователи 1 и 3

мой запрос в настоящее время выглядит следующим образом

{ 
    "filtered": { 
     "filter": { 
      "bool": { 
       "should": [{ 
        "term": { 
         "events_count": 0 
        } 
       }, { 
        "nested": { 
         "path": "events", 
         "query": { 
          "bool": { 
           "must_not": [{ 
            "range": { 
             "events.start": { 
              "lte" : "2016-02-08" 
             } 
            } 
           }, { 
            "range": { 
             "events.end": { 
              "gte": "2016-02-08" 
             } 
            } 
           }] 
          } 
         } 
        } 
       }] 
      } 
     } 
    } 
} 

я индексироваться events_count отдельным, потому что я уже отказался от смешения без вести с вложенными объектами он просто не работает, как ожидалось

Актуальные проблемы:

Так что проблема с этим пользователем пытаются соответствовать даты начала и окончания вместе, в настоящее время User1 соответствует критериям начала lte $ search_date, когда это не должно.

Логика, которую я пытаюсь написать, - это WHEN events.start < $ search_date AND events.end> $ search_date, считайте это совпадением.

Что на самом деле происходит, кажется, является его оценкой конечной логики запуска & как отдельная логика и, таким образом, если начать < $ search_date даже если .END < $ search_date считает этим совпадением.

ответ

0

Вам необходимо обернуть ваши запросы диапазона в другом запросе bool и в качестве предложения (эквивалент SQL AND). must_not исключит все документы, которые соответствуют любому из запросов

Таким образом, вместо

must_not => range_queries 

сделать это следующим образом:

must_not => bool => must => range_queries