2017-02-13 43 views
2

時發生意外的BoolQuery我正在使用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對象。

$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]}}]}}} 

我在做什麼錯了?或者,我該如何擴展我的搜索範圍並避免使用空查詢?

回答

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()); 
} 
+0

太棒了,它的工作原理!非常感謝! – Daniel