Поиск по периодам elasticsearch

Задача заключается в поиске нужного лота у которого в определенный промежуток времени, задана искомая актуальная цена.

У лота есть периоды от и до и в рамках этого периода присутствует определенная цена, по истечению периода настает следующий период, у которого цена ниже, или выше предыдущей.

В MySQL Бд это реализовано с помощью двух таблиц, первая это lots вторая lot_periods. Соответственно периоды, в таблице lot_periods связаны с лотом через lot_id. Мы можем построить запрос от сущности лота, задать промежуток даты от и даты до, а также цену от и до и получить необходимый лот.

Структура БД lot_periods: 

Структура БД lot_periods

Пример записи lot_periods

Пример записи

Вот теперь пытаюсь повторить это же на эластике, но пока безрезультатно :)

Мапинг для индексирования

{
"mappings" : {
    "properties" : {
        "id": {
            "type": "integer"
        },
        "periods": {
            "type": "nested",
            "properties" : {
                "start_date_requests": {"type": "date"},
                "end_date_requests": {"type": "date"},
                "current_price": {"type": "integer"}
            }
        }
    }
}

}

Запрос

{
"query": {
    "bool":{
        "must":{
            "nested": {
                "path": "periods",
                "query": {
                    "bool": {
                        "must": [
                            { "range": {"periods.start_date_requests": {"gte": "passed_start_date"}} },
                            { "range": {"periods.end_date_requests": {"lte": "passed_end_date"}} },
                            { "range": {"periods.current_price": {"gte": "passed_price_from"}} },
                            { "range": {"periods.current_price": {"lte": "passed_price_to"}} }
                        ]
                    }
                }
            }
        }
    }
}
}

Ну вот как-то так получилось, думаю если бы был всего один период, то все бы находилось нормально.

Подскажите пожалуйста как это реализовать ?


Ответы (0 шт):