2017-02-13 11 views
2

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