gpt4 book ai didi

elasticsearch - 在 PHP 中 Elasticsearch 多个范围

转载 作者:行者123 更新时间:2023-12-02 22:15:23 27 4
gpt4 key购买 nike

我一直盯着我的显示器看太久,不得不问:如何使用 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'],
];

我正在努力寻找一个涵盖 ES v0.9 后这种情况的合适的最新示例,但在我的 v1.4.2 上失败了。

最佳答案

你的回答是正确的。顺便说一句,如果您使用 bool 过滤器而不是 and/or/not 过滤器集,性能往往会更好。情况并非总是如此,但通常如此。

And/or/not 在“跳蛙迭代器”模式中工作。这会在第一个过滤器中找到第一个匹配的文档,然后尝试“跳过”其余的过滤器迭代器,直到它们都在同一个文档上对齐。这使得它对于稀疏过滤器非常有效。

相比之下,Bool 过滤器对位图(表示匹配的文档)进行按位组合,这对于更密集的过滤器来说往往更有效。您的过滤器看起来比较密集:

  • number_of_products 过滤器是所有 values >= $products['min'],这可能是大量匹配的文档...都在连续范围内
  • price 过滤器的密度取决于范围的大小,但也可能非常密集(且连续)。如果没有$price['max'],它也是无界到无穷大。

在实践中,bool 往往比 and/or/not 提供更好的性能,并且在这个例子中可能会,但是 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)
]
]
]
]
]
]
]
]
]
];

关于elasticsearch - 在 PHP 中 Elasticsearch 多个范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28439100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com