FOSElasticaBundle: запрос соответствия комбинаций значений - PullRequest
0 голосов
/ 29 января 2020

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

1 Ответ

0 голосов
/ 30 января 2020

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

$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);

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

...