FOSElasticaBundle : Сопоставление запросов с комбинацией значений

Мне нужна помощь, чтобы заставить мой запрос 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 в другом логическом запросе без каких-либо результатов. Спасибо !!


person ArGh    schedule 29.01.2020    source источник
comment
Не могли бы вы поместить индексный скрипт и данные в вопрос?   -  person YouXiang-Wang    schedule 30.01.2020


Ответы (1)


Наконец-то нашел рабочий код. пришлось заменить эту деталь

$filterQuery = new \Elastica\Query\Terms();
$filterQuery->setTerms('tags', ['Tag one', 'Tag three']);
$subQuery->addMust($filterQuery);

этим

$tagFilters = ['Tag one', 'Tag three'];

$boolFilteredQuery = new \Elastica\Query\BoolQuery();
foreach($tagFilters as $tagFilter){
    $filterQuery = new \Elastica\Query\Match();
    $filterQuery->setFieldQuery('tags', $tagFilter);
    $boolFilteredQuery->addShould($filterQuery);
}
$boolQuery->addMust($boolFilteredQuery);

если у кого-то есть объяснение, мне интересно.
Спасибо

person ArGh    schedule 30.01.2020