我一直盯着我的显示器太长时间不要问:如何使用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上失败了.
你的答案是对的.另外,如果使用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)
| 归档时间: |
|
| 查看次数: |
2941 次 |
| 最近记录: |