Mot-clé tokenizer de mappage élastique pour éviter de scinder des jetons et activer l'utilisation de caractères génériques
J'essaie de faire une fonction d'auto-complétion avec angularjs et elasticsearch sur un domaine donné, par exemple countryname
. il peut contenir des noms comme "France", "Espagne" ou "composé des noms de" j'aime "Sierra Leone".
Dans la cartographie de ce champ est not_analyzed
pour éviter élastique pour marquer ", composée de noms"
"COUNTRYNAME" : {"type" : "string", "store" : "yes","index": "not_analyzed" }
J'ai besoin d'interroger elasticsearch:
- pour filtrer le document avec quelque chose comme "countryname:valeur", où la valeur peut contenir des caractères génériques
- et de faire une agrégation sur le countryname renvoyé par le filtre, ( je ne l'agrégation pour ne recevoir que des données distinctes, le comte est inutile pour moi, peut-être il est une meilleure solution)
Je ne peux pas utiliser les caractères génériques avec le "not_analyzed" champ :
c'est ma requête mais générique en valeur "variable" ne fonctionne pas et il est sensible à la casse :
Le générique seul son travail :
curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
"fields": [
"COUNTRYNAME"
],
"query": {
"query_string": {
"query": "COUNTRYNAME:*"
}
},
"aggs": {
"general": {
"terms": {
"field": "COUNTRYNAME",
"size": 0
}
}
}
}'
mais cela ne fonctionne pas (franc*) :
curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
"fields": [
"COUNTRYNAME"
],
"query": {
"query_string": {
"query": "COUNTRYNAME:Franc*"
}
},
"aggs": {
"general": {
"terms": {
"field": "COUNTRYNAME",
"size": 0
}
}
}
}'
J'ai essayé aussi avec bool must query
mais ne fonctionnent pas avec ce not_analyzed champ et générique :
curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
"fields": [
"COUNTRYNAME"
],
"query": {
"bool": {
"must": [
{
"match": {
"COUNTRYNAME": "Franc*"
}
}
]
}
},
"aggs": {
"general": {
"terms": {
"field": "COUNTRYNAME",
"size": 0
}
}
}
}'
Ce que je suis absent ou mal? dois-je laisser le champ analyzed
dans la cartographie et l'utilisation d'un autre analyseur qui ne split composé de nom en jeton??
source d'informationauteur AlainIb | 2014-10-21
Vous devez vous connecter pour publier un commentaire.
j'ai trouvé une solution qui fonctionne : le "mot-clé" tokenizer.
créer un analyseur personnalisé et de l'utiliser dans le mappage pour le domaine je veux garder sans les séparer par un espace :
si je peux utiliser le caractère générique dans la requête sur le champ COUNTRYNAME, qui n'est pas coupée en deux :
le résultat :