我凝视着监视器已经太久了,不要问:我如何使用 Elastic Search PHP库* 执行 多个范围查询 ? *
我正在尝试根据 价格 标准(小于或大于)和类别内的 产品数量 (最少2个产品,仅2个产品,等等)查询我的索引。
虽然$searchParams['body']['query']['range']['number_of_products'] = ['gte' => $products + 1];单独工作正常,但结合
$searchParams['body']['query']['range']['number_of_products'] = ['gte' => $products + 1];
$searchParams['body']['query']['range']['price'] = [ 'gte' => $price['min'], 'lte' => $price['max'], ];
我正在努力找到一个不错的近期示例,该示例涵盖ES v0.9之后的此场景,但在我的v1.4.2上却失败了。
您的回答是正确的。顺便说一句,如果您使用bool过滤器而不是一and/or/not组过滤器,性能往往会更好。并非总是如此,但通常如此。
bool
and/or/not
和/或/不适用于“跨越式迭代器”模式。这将在第一个过滤器中找到第一个匹配的文档,然后尝试“跳过”其余的过滤器迭代器,直到它们都在同一文档上对齐为止。这使得它对于稀疏过滤器非常有效。
相比之下,Bool过滤器会按位组合位图(表示匹配的文档),这对于密度更高的过滤器而言往往更为有效。您的过滤器看上去相对密集:
number_of_products
values >= $products['min']
price
在实践中,布尔值倾向于提供比和/或/非更好的性能,并且在此示例中可能会比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) ] ] ] ] ] ] ] ] ] ];