php - 组合搜索对象并使用 $search->getQueries() 时出现意外的 BoolQuery

标签 php elasticsearch dsl ongr

我正在使用 ongr/elasticsearch-dsl 包来构建我的查询,我需要在不同的位置组成搜索对象。当我在同一个地方执行此操作时,它会按预期工作。

use ONGR\ElasticsearchDSL\Search;
use ONGR\ElasticsearchDSL\Query\Compound\BoolQuery;
use ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery;

$search = new Search();
$bool = new BoolQuery();
$search->addQuery($bool);

$bool->add(new TermsQuery('id', [1]));
$bool->add(new TermsQuery('id2', [2]));

echo json_encode($search->toArray());

结果如下所示:

{"query":{"bool":{"must":[{"terms":{"id":[1]}},{"terms":{"id2":[2]}}]}}}

现在我将搜索对象传递给另一个方法并尝试添加我的 TermQuery-Objects。

$search = new Search();
$bool = new BoolQuery();
$search->addQuery($bool);

$mapper->map($search);

//---
public function map(search) {
    $bool = $search->getQueries();
    $bool->add(new TermsQuery('id', [1]));
    $bool->add(new TermsQuery('id2', [2]));

    echo json_encode($search->toArray());
}

结果几乎相同,但有一个额外的空 BoolQuery。

{"query":{"bool":{"must":[{"bool":[]},{"terms":{"id":[1]}},{"terms":{"id2":[2]}}]}}}

我做错了什么?或者我如何扩展搜索并避免空查询?

最佳答案

不要使用BoolQuery,当您添加任何查询时,它会自动形成BoolQuery。更多信息请点击:http://docs.ongr.io/ElasticsearchDSL/HowTo/HowToSearch在“多个查询和过滤器”主题中。

$search = new Search();

$mapper->map($search);

//---
public function map($search) {
    $search->add(new TermsQuery('id', [1]));
    $search->add(new TermsQuery('id2', [2]));

    echo json_encode($search->toArray());
}

关于php - 组合搜索对象并使用 $search->getQueries() 时出现意外的 BoolQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42208166/

相关文章:

javascript - 如何将函数中找到的javascript变量值存储在php变量中

每个用户的 ElasticSearch 索引?

java - 升级到 1.1.3 spring 集成 java dsl 后,错误消息从未传递到错误 channel

python - 仅显示回溯的第一行和最后一行

Android Studio Gradle DSL 方法未找到 : 'android()' -- Error(17, 0)

php - 如何从字符串中删除最后一次出现的 OR

php 复制()不起作用

php - 翻译日期(“d F Y (H :i) function php

java - Elasticsearch 将日期存储为数组

elasticsearch - 更新ElasticSearch映射类型而不删除它