ElasticSearch и filter multi range

Различные вопросы по установке и настройке фреймворка, конфигурции веб-сервера и IDE.
Закрыто
k1g0r
Сообщения: 3
Зарегистрирован: 2017.09.29, 14:23

ElasticSearch и filter multi range

Сообщение k1g0r »

Здравствуйте!
Вопрос по использованию фильтра range для нескольких полей.

Код: Выделить всё

        $t = $test::find()->filter([
            'range' => [
                'year' => [
                    'gte' => 2005,
                    'lte' => 9999,
                ]
            ],
        ])->all();

        foreach ($t as $a) {
            echo 'test '.$a->year . ' ' . $a->price . "<br>";
        }
этот код фильтрует по году и выводит:
test 2014 1749000
test 2006 1299000
test 2011 1120000
test 2008 165000
т.е. фильтрует по году, все ок.
Но есть потребность отфильтровать по нескольких полям:

Код: Выделить всё

        $t = $test::find()->filter([
            'range' => [
                'year' => [
                    'gte' => 2005,
                    'lte' => 9999,
                ],
                'price' => [
                    'gte' => 0,
                    'lte' => 30000,
                ]
            ],
        ])->all();
в этом случае срабатывает только второй фильтр:
test 2008 0
test 1983 30000
test 2006 0
test 1984 25000

При запросе формируется:

Код: Выделить всё

{"size":10,"query":{"match_all":{}},"filter":{"range":{"year":{"gte":2005,"lte":9999},"price":{"gte":0,"lte":30000}}}}
Кто сталкивался с такой проблемой или знает решение, подскажите. Пробовал кучу вариантов:
добавить два фитра подряд
andFilter не работает для ES
отдельно два range в массиве.
Все сводится к тому что работает только второй фильтр
k1g0r
Сообщения: 3
Зарегистрирован: 2017.09.29, 14:23

Re: ElasticSearch и filter multi range

Сообщение k1g0r »

Вдруг кому-то пригодится, решение:

Код: Выделить всё

            ->filter(
                [
                    'and' => [
                        [
                            'range' => [
                                'year' => [
                                    'from' => 2008,
                                    'to' => 2008,
                                ]
                            ],
                        ],
                        [
                            'range' => [
                                'price' => [
                                    'from' => 1,
                                    'to' => 50000,
                                ]
                            ],
                        ]
                    ]
                ])
Закрыто