Bonjour,

j'utilise Elasticsearch dans Symfony (via FOS\ElasticaBundle) et le JSON de mes données ressemble à ça.

Chaque "app/user_worker" peut avoir plusieurs "domains" de compétence et pour chacun il y a donc 1 "domain" et 1 ou plusieurs "offers" (professional, premium, prestige).

Pour mes recherches j'initialise ma requête ainsi :

$query = new \Elastica\Query\BoolQuery();

Ensuite, pour chercher une entrée par "domain" j'utilise :

$domainSlug = 'art-culturel';

$subquery = new \Elastica\Query\MultiMatch();
$subquery->setFields('domains.domain.slug')->setQuery($domainSlug);
$filtered = new \Elastica\Query\Filtered($subquery);
$domainQuery = new \Elastica\Query\Nested();
$domainQuery->setQuery($filtered)->setPath('domains.domain');
$query->addMust($domainQuery);

Ça fonctionne bien.

Pour chercher une entrée par "offer" j'utilise de la même façon :

$offerSlug = 'premium';

$subquery = new \Elastica\Query\MultiMatch();
$subquery->setFields('domains.offers.slug')->setQuery($offerSlug);
$filtered = new \Elastica\Query\Filtered($subquery);
$offerQuery = new \Elastica\Query\Nested();
$offerQuery->setQuery($filtered)->setPath('domains.offer');
$query->addMust($offerQuery);

Ça fonctionne bien aussi.

Mais si je cherche avec les 2 critères dans $query, le user_worker avec l'id = 4 ressort alors que "art-culturel" n'est pas associé à "premium" (mais comme ce user a aussi un domain avec "premium", il apparait dans les résultats).

Comment faire pour avoir seulement les résultats de "app/user_worker" ayant une entrée dans le tableau "domains" avec à la fois "domain.slug = 'art-culturel'" ET "offers.slug contenant 'premium'" ?
Quelle méthode de Elastica dois-je utiliser ?
Est-ce que je dois modifier ma structure dans Elasticsearch ?

Merci d'avance pour vos retours.

1 réponse


yanlep
Auteur

Vraiment pas d'idée ? Même sans parler de Symfony, directement avec Elasticsearch ?