Страница 1 из 1

ElasticSearch и filter multi range

Добавлено: 2017.12.16, 16:15
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 в массиве.
Все сводится к тому что работает только второй фильтр

Re: ElasticSearch и filter multi range

Добавлено: 2017.12.17, 20:59
k1g0r
Вдруг кому-то пригодится, решение:

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

            ->filter(
                [
                    'and' => [
                        [
                            'range' => [
                                'year' => [
                                    'from' => 2008,
                                    'to' => 2008,
                                ]
                            ],
                        ],
                        [
                            'range' => [
                                'price' => [
                                    'from' => 1,
                                    'to' => 50000,
                                ]
                            ],
                        ]
                    ]
                ])