2017-02-13 1 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

Смежные вопросы