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

时间:2017-02-13 15:53:30

标签: 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]}}]}}}

现在我将search-object传递给另一个方法,并尝试添加我的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]}}]}}}

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

1 个答案:

答案 0 :(得分: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());
}