当前位置: 首页 > 面试题库 >

在PHP中elasticsearch多个范围

华乐逸
2023-03-14
问题内容

我凝视着监视器已经太久了,不要问:我如何使用 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组过滤器,性能往往会更好。并非总是如此,但通常如此。

和/或/不适用于“跨越式迭代器”模式。这将在第一个过滤器中找到第一个匹配的文档,然后尝试“跳过”其余的过滤器迭代器,直到它们都在同一文档上对齐为止。这使得它对于稀疏过滤器非常有效。

相比之下,Bool过滤器会按位组合位图(表示匹配的文档),这对于密度更高的过滤器而言往往更为有效。您的过滤器看上去相对密集:

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

在实践中,布尔值倾向于提供比和/或/非更好的性能,并且在此示例中可能会比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)
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ]
];


 类似资料:
  • 问题内容: 以下range_query返回预期结果: 但是,与多个范围查询一起,则不会返回任何内容: 在多个字段上使用多个range_queries的正确方法是什么? 编辑: 啊,好的,所以这是我使用range_filter而不是range_query的地方?这听起来很有希望,所以我仅使用一个范围过滤器重新编写了查询。如果我在其他地方弄乱了查询,请在此处发布所有内容。我正在执行GET,并且源密钥中

  • 问题内容: 我正在使用最新版本的elasticsearch-php以及最新版本的MongoDB和ElasticSearch。 我需要对可以包含一个或多个值的多个字段进行搜索。例: country_code应为NL,BE或DE,并且类别应包含AA01,BB01,CC02或ZZ11 我以为我会按照以下方式解决它(PHP): 但是结果甚至还不能接近我期望返回的数据。 有时 $ countries 和/或

  • 问题内容: 我必须在弹性中插入一个json数组。链接中可接受的答案建议在每个json条目之前插入标题行。答案是2岁,市场上是否有更好的解决方案?我需要手动编辑json文件吗? 问题答案: 好的,那么您可以使用简单的Shell脚本来完成一些非常简单的操作(请参见下文)。这个想法是不必手动编辑文件,而是让Python进行编辑并创建另一个文件格式符合端点期望的文件。它执行以下操作: 首先,我们声明一个小

  • 问题内容: 我必须阅读一些文件,其中一些文件采用Excel格式,有些文件采用CSV格式。一些文件具有数百列。 有没有一种方法可以选择多个列范围而不指定所有列名或位置?例如,选择第1 -10、15、17和50-100列: 从Excel文件和CSV文件创建数据框时以及创建数据框框程序后,我都需要知道如何执行此操作。 问题答案: 采用 所以你可以做

  • 我想计算一天内每个产品的每个IP访问计数。 一个索引中有三个参数(nginx访问日志): 时间戳 客户IP product\u id 我知道date\u直方图可以参考https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.

  • 问题内容: ElasticSearch中如何有多个节点?我在elasticsearch.yml中使用以下内容,但只有最后一个节点启动,浏览器抱怨:。 问题答案: 我认为最简单的方法是在命令行上指定这些参数。要启动三个节点,您只需要在elasticsearch主目录中运行以下三个命令: 另一个解决方案是创建3个不同的配置文件,并使用参数启动三个节点。