Мне нужна помощь, чтобы заставить мой запрос elasticsearch полностью работать (используя версию 6.8.5).
У меня есть список объектов ES, хранящихся в моем индексе:
Object 1:
name: abcd
type: A
tags: Tag one, Tag two
Object 2:
name: abcdef
type: B
tags: Tag three
Object 3:
name: cdef
type: B
tags: Tag one, Tag three
Object 4:
name: abcd efgh
type: C
tags: Tag one, Tag three
Object 5:
name: efghbc
type: A
tags: Tag three
Мне нужно запросить:
Object.name MUST contain "bc"
AND
Object.type MUST be (A OR C)
AND
Object.tags MUST have (tag1 OR tag3)
Итак, мои результаты должны дать мне:
Object 1 : match "bc" AND A type AND "tag one"
Object 4 : match "bc" AND C type AND ("tag one" AND "tag three")
Object 5 : match "bc" AND A type AND "tag three"
Вот мой PHP-код на данный момент:
$boolQuery = new \Elastica\Query\BoolQuery();
// ex : $q = 'bc';
if (!empty($q)) {
$fieldQuery = new \Elastica\Query\MatchPhrasePrefix();
$fieldQuery->setFieldQuery('name', $q);
$fieldQuery->setFieldParam('name', 'analyzer', 'ngram_analyzer');
$boolQuery->addShould($fieldQuery);
} else {
$fieldQuery = new \Elastica\Query\MatchAll();
$boolQuery->addMust($fieldQuery);
}
$subQuery = new \Elastica\Query\BoolQuery();
$typeQuery = new \Elastica\Query\Terms();
$typeQuery->setTerms('type', ['A', 'C']);
$subQuery->addMust($typeQuery);
$filterQuery = new \Elastica\Query\Terms();
$filterQuery->setTerms('tags', ['Tag one', 'Tag three']);
$subQuery->addMust($filterQuery);
$boolQuery->addMust($subQuery);
$query = new \Elastica\Query($boolQuery);
Мои результаты всегда нулевые. Если я удалю filterQuery, мои результаты будут соответствовать:
Object 1 : match "bc" AND A type
Object 4 : match "bc" AND C type
Object 5 : match "bc" AND A type
Я также пытался изолировать filterQuery в другом логическом запросе без каких-либо результатов. Спасибо !!