Как сопоставить все аргументы, передаваемые в массиве в упругом поиске?
Здесь 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);