web-dev-qa-db-fra.com

Définition de l'analyseur lors d'une requête dans ElasticSearch

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.

35
nikhil tyagi

Les requêtes term, prefix et wildcard attendent que la valeur spécifiée dans la requête soit déjà analysée.

22
imotov

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 .

7
czerasz

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 le search_analyzer réglage

Les documents donnent également un exemple. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html

1
Tieme