Je suis assez nouveau sur elasticsearch et j'ai juste besoin de quelques éclaircissements: pouvons-nous définir un analyseur tout en interrogeant le serveur de recherche. Je l'ai essayé avec la requête "text" et "field" et cela fonctionne très bien:
Requete:
curl -XPOST http://localhost:9200/test/user/_search? -d '{ "query" : {
"text" : {"_all" : {"query" :"Vaibhav","analyzer" :
"lowercase_keyword" }} } }'
Résultat:
{"took":144,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.10848885,"hits":{"_index":"test","_type":"user","_id":"1","_score":0.10848885,
"_source" : {
"first_name": "Vaibhav",
"last_name":"saini",
"password":"pwd"
Mais lorsque j'essaie de faire la même chose avec la requête terme/préfixe/caractère générique, j'obtiens l'exception:
Requete:
curl -XPOST http://localhost:9200/test/user/_search? -d '{
"query" : { "term" : {"_all" : {"query" :"Vaibhav","analyzer" :
"lowercase_keyword" }} } }'
Résultat:
{"error":"SearchPhaseExecutionException[Failed to execute phase [query], total failure; shardFailures
{[kws9J6tbQtWCMNKBm3Gpkw][test][4]: SearchParseException[[test][4]:
from[-1],size[-1]: Parse Failure [Failed to parse source
[\n{\n\"query\" : {\n\"term\" : {\"_all\" : {\"query\"
:\"Vaibhav\",\"analyzer\" : \"lowercase_keyword\" }}\n}\n}]]]; nested:
QueryParsingException[[test] [term] query does not support [query]];
}{[kws9J6tbQtWCMNKBm3Gpkw][test][1]: SearchParseException[[test][1]:
from[-1],size[-1]: Parse Failure [Failed to parse source
[\n{\n\"query\" : {\n\"term\" : {\"_all\" : {\"query\"
:\"Vaibhav\",\"analyzer\" : \"lowercase_keyword\" }}\n}\n}]]]; nested:
QueryParsingException[[test] [term] query does not support [query]];
}{[kws9J6tbQtWCMNKBm3Gpkw][test][2]: SearchParseException[[test][2]:
from[-1],size[-1]: Parse Failure [Failed to parse source
[\n{\n\"query\" : {\n\"term\" : {\"_all\" : {\"query\"
:\"Vaibhav\",\"analyzer\" : \"lowercase_keyword\" }}\n}\n}]]]; nested:
QueryParsingException[[test] [term] query does not support [query]];
}]","status":500}
Alors, est-ce que nous ne pouvons pas définir d'analyseurs en interrogeant le serveur elasticsearch pour certains types de requêtes et pour d'autres que nous pouvons? Sinon, est-ce que je fais quelque chose de mal?
Toute aide est grandement appréciée.
Les requêtes term
, prefix
et wildcard
attendent que la valeur spécifiée dans la requête soit déjà analysée.
Cette syntaxe a fonctionné pour moi:
GET /_search
{
"query": {
"match_phrase": {
"controller": {
"analyzer": "keyword",
"query": "api/v2/test"
}
}
}
}
Trouvez plus de détails dans la documentation .
Vous pouvez définir un analyseur de recherche personnalisé à utiliser pour les requêtes.
De la documentation:
Habituellement, le même analyseur doit être appliqué au moment de l'index et au moment de la recherche, pour garantir que les termes de la requête sont au même format que les termes de l'index inversé.
Parfois, cependant, il peut être judicieux d'utiliser un analyseur différent au moment de la recherche, comme lors de l'utilisation de l'analyse-edgengram-tokenizer pour la saisie semi-automatique.
Par défaut, les requêtes utiliseront le
analyzer
défini dans le mappage de champ, mais cela peut être remplacé par lesearch_analyzer
réglage
Les documents donnent également un exemple. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html