Je reviens vers vous car j'ai encore quelques incompréhension entre les query, filters, filtered.
Voila l'objectif à atteindre, je veux les documents qui contiennent un ou plusieurs mots. Si l'utilisateur saisie 2 mots, je veux impérativement avec les documents qui ont ces 2 mots.
Je pourrais donc m'en sortir en déconcatenant les 2 mots, et en faisant un And.
Le problème, c'est que la recherche sur plusieurs champs : le champ EtapeCode et MesureCode. Avec le And, il me faudrait faire une requête du type:
le premier mot est dans etapeCode, ou dans MesureCode et le deuxième mot est dans etapeCode ou mesureCode. ce qui deviendrait vite compliqué avec 3 ou 4 mots.
J'ai donc pensé utiliser le query_string.
J'ai 2 requêtes Elastic Search, qui sont censé faire la même chose, mais je n'arrive pas à expliquer le résultat.
Pour la première requête, j'ai repris le principe du match_all repris plus haut dans ce sujet.
{
"query": {
"filtered": {
"query": {
"match_all": {
}
},
"filter": {
"query": {
"query_string": {
"query": "attenuation a6",
"fields": [
"etapeCode",
"mesureCode",
"etapeDesc",
"mesureDesc"
]
}
}
}
}
},
"facets": {
"etapeMesureCodeTop": {
"terms": {
"size": 20,
"script": "doc['etapeCode'].value +'###'+doc['mesureCode'].value"
}
}
}
}
Ce premier résultat me permet d'avoir les facets correspondant à mes filtres, mais la recherche me retourne les documents contenant attenuation, ou "a6", ce qui ne correspond pas à ce que je veux.
Dans ma deuxième requête, j'ai repris l'exemple donnée sur le guide officiel et j'ai rajouté le query dans les filtered.
{
"query": {
"filtered": {
"query": {
"query_string": {
"fields": [
"etapeCode",
"etapeDesc",
"mesureCode",
"mesureDesc"
],
"query": "atténuation a6"
}
}
}
},
"facets": {
"etapeMesureCodeTop": {
"terms": {
"size": 20,
"script": "doc['etapeCode'].value +'###'+doc['mesureCode'].value+'###'"
}
}
}
}
Avec ce deuxième exemple, pour le coup, les résultats retournés correspondent bien aux documents contenant attenuation et a6, mais les facets ne prenne pas en compte le filtre.
Quel est donc la différence entre le filter -> query -> query_string et le filtered -> query_string ? Je suis un peu perdu.