Как сопоставить все аргументы, передаваемые в массиве в упругом поиске?

Здесь term дает результат, если одно из всех args (1,2) совпадает, и мне нужно, чтобы все args были в степени.id пользователя
здесь у меня есть такие данные

"id": 66,
"name": null,
"degrees": [
    {
        "id": 1,
        "name": "BCA",
    },{
        "id": 2,
        "name": "MCA",
    }
]

Так что мне нужно, чтобы, если BCA и MCA обе степени существуют, только те записи будут получены в результате

$term = new \Elastica\Query\Terms();
$term->setTerms('degrees.id', array('1','2'));

return $boolQuery->addMust($term);

1 ответ

Решение

Что вы делаете со своим setTerms на самом деле OR на degrees поле.

Сделать AND запрос, я рекомендую использовать Elastica\Query\BoolQuery класс следующим образом:

$BCAQuery = new Elastica\Query\Term();
$BCAQuery->setTerm('degree.id', 1);

$MCAQuery = new Elastica\Query\Term();
$MCAQuery->setTerm('degree.id', 2);

$boolQuery = new BoolQuery();
$boolQuery->addMust($BCAQuery);
$boolQuery->addMust($MCAQuery);

Помните, что если degrees отображается как nested использовать ваш запрос bool с Elastica\Query\Nested

$degreesQuery = new Elastica\Query\Nested();
$degreeQuery->setPath('degrees');
$degreesQuery->setQuery($boolQuery);
Другие вопросы по тегам