弹性在PHP中搜索多个范围

hoo*_*ood 2 elasticsearch

我一直盯着我的显示器太长时间不要问:如何使用Elastic Search PHP库执行多个范围查询

我试图根据价格标准(少于和多于)和该类别中的产品数量(最少2个产品,仅2个产品等)查询我的指数.

虽然$searchParams['body']['query']['range']['number_of_products'] = ['gte' => $products + 1]; 它自己的作品很好,结合了

$searchParams['body']['query']['range']['price'] = [
    'gte' => $price['min'],
    'lte' => $price['max'],
];
Run Code Online (Sandbox Code Playgroud)

我很难找到一个体面的最新例子,涵盖ES v0.9之后的这个场景,这在我的v1.4.2上失败了.

Zac*_*ach 5

你的答案是对的.另外,如果使用bool过滤器而不是and/or/not过滤器集,性能会更好.情况并非总是如此,但通常情况并非如此.

和/或/不适用于"跳跃迭代器"模式.这会在第一个过滤器中找到第一个匹配的文档,然后尝试"跳过"其余的过滤器迭代器,直到它们都在同一个文档上对齐.这使得它对稀疏滤波器有效.

相比之下,Bool过滤器按比特组合位图(代表匹配的文档),这对于更密集的过滤器更有效.您的过滤器看起来比较密集

  • number_of_products过滤器是所有values >= $products['min'],这可能是一个大数目的匹配文档的所有...在一个连续的范围
  • price过滤器的密度取决于范围的大小,但也可能非常密集(和连续).如果没有$ price ['max'],它也无限无限.

在实践中,bool倾向于提供比和/或/更好的性能,并且可能在此示例中,但是YMMV.:)

$searchParams = [
    'index' => 'my_index',
    'type' => 'my_type',
    'body' => [
        'query' => [
            'filtered' => [
                'filter' => [
                    'bool' => [
                        'must' => [
                            [
                                'range' => [
                                    'number_of_products' => [
                                        'gte' => $products['min']
                                    ]
                                ]
                            ],
                            [
                                'range' => [
                                    'price' => [
                                        'gt' => $price['min'],
                                        'lt' => ($price['max'] ? : null)
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ]
];
Run Code Online (Sandbox Code Playgroud)