Как в elasticsearch искать по nested?

есть Users в них есть массив eDates:
"eDates" : [ 
        {
            "dateFrom" : ISODate("2017-04-01T12:33:50.000+0000"), 
            "dateTo" : ISODate("2017-04-05T12:33:50.000+0000"), 
            "_id" : ObjectId("58c2ab50875060766968d41d")
        }, 
        {
            "dateFrom" : ISODate("2017-10-01T12:34:04.000+0000"), 
            "dateTo" : ISODate("2017-10-07T12:34:04.000+0000"), 
            "_id" : ObjectId("58c2ab50875060766968d41c")
        }, ...
    ],

Мне нужно отфильтровать по дате юзеров в которых хоть 1 элемент с массива совпадает с заданным фильтром.
Т.е. я заполняю dateFrom и dateTo и ищу
let nested = []
let from = {"range" : {"eDates.dateFrom" : {"gt": new Date(data.dateFrom)} }};
let to = {"range" : {"eDates.dateTo" : {"lt": new Date(data.dateTo)} }};
nested.push(from, to);

"filter": {
"nested" : {
            "path" : "eDates",
            "query" : {
                "bool" : {
                    "must" : nested
                }
            }
        }
}


Проблема в том что оно может находить совпадения в разных саб. обьектах а не точно в 1.
По аналогу как делает это в mongo:
{ "eDates": { $elemMatch: {dateFrom: {$gte: ISODate("2016-04-04T00:00:00.000Z") }, dateTo: {$lte: ISODate("2017-04-27T00:00:00.000Z")} } } }
  • Вопрос задан
  • 1089 просмотров
Пригласить эксперта
Ответы на вопрос 1
@RidgeA
Проблема в том, что в обычном порядке массив объектов при индексации мапится в один объект.
По-этому и находит так.
Что бы искало так как ты хочешь - надо изменить маппинг.

https://www.elastic.co/guide/en/elasticsearch/guid...
https://www.elastic.co/guide/en/elasticsearch/guid...
https://www.elastic.co/guide/en/elasticsearch/refe...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы