Elasticsearch générique recherche sur not_analyzed champ
J'ai un index comme paramètres suivants et de la cartographie;
{
"settings":{
"index":{
"analysis":{
"analyzer":{
"analyzer_keyword":{
"tokenizer":"keyword",
"filter":"lowercase"
}
}
}
}
},
"mappings":{
"product":{
"properties":{
"name":{
"analyzer":"analyzer_keyword",
"type":"string",
"index": "not_analyzed"
}
}
}
}
}
J'ai du mal avec la prise d'une mise en œuvre pour la recherche de génériques sur name
champ. Mon exemple des données de cette façon;
[
{"name": "SVF-123"},
{"name": "SVF-234"}
]
Quand j'ai effectuer la requête suivante;
http://localhost:9200/my_index/product/_search -d '
{
"query": {
"filtered" : {
"query" : {
"query_string" : {
"query": "*SVF-1*"
}
}
}
}
}'
Il retourne SVF-123
,SVF-234
. Je pense que, elle encore tokenizes de données. Il ne doit retourner qu' SVF-123
.
Pourriez-vous s'il vous plaît aider sur ce point?
Merci d'avance
Pour info,vous ne voulez vraiment pas que l'un des principaux générique, je pense qu'il va regarder tous les doc si vous faites cela.
Je sais que le défaut sur le rendement, mais, j'ai besoin d'effectuer de recherche de génériques même SVF-*
Je pense que la fuite des caractères génériques est très bien, vous juste ne veulent pas en tête..
Lorsque l'utilisateur VF, IL doit retourner SVF-... c'est pourquoi j'ai utilisé diriger des génériques
Je pense que la meilleure pratique consiste à utiliser les revers du jeton alors que le leader des caractères génériques peuvent devenir de fuite des caractères génériques.
Je sais que le défaut sur le rendement, mais, j'ai besoin d'effectuer de recherche de génériques même SVF-*
Je pense que la fuite des caractères génériques est très bien, vous juste ne veulent pas en tête..
Lorsque l'utilisateur VF, IL doit retourner SVF-... c'est pourquoi j'ai utilisé diriger des génériques
Je pense que la meilleure pratique consiste à utiliser les revers du jeton alors que le leader des caractères génériques peuvent devenir de fuite des caractères génériques.
OriginalL'auteur Hüseyin BABAL | 2014-01-16
Vous devez vous connecter pour publier un commentaire.
Il ya un couple de choses qui vont mal ici.
D'abord, vous dites que vous ne voulez pas les termes analysés indice de temps. Ensuite, il y a un analyseur est configuré (c'est utilisé le temps de recherche) qui génère des termes incompatibles. (Ils sont mis en minuscule)
Par défaut, tous les termes à la fin dans le
_all
-champ avec l'analyseur standard. C'est là que vous vous retrouvez à la recherche. Depuis il tokenizes sur "-", vous vous retrouvez avec un OU des "*SVF" et "1*".Essayer de le faire d'une facette sur _all et sur le nom pour voir ce qu'il se passe.
Voici un praticable de Jouer et de gist: https://www.found.no/play/gist/3e5fcb1b4c41cfc20226 (https://gist.github.com/alexbrasetvik/3e5fcb1b4c41cfc20226)
Vous devez vous assurer que les termes de l'index est compatible avec ce que vous recherchez. Vous voudrez probablement désactiver
_all
, car il peut boueux.OriginalL'auteur Alex Brasetvik
Ma solution aventure
J'ai commencé mon cas, comme vous pouvez le voir dans ma question. À chaque fois, j'ai changé une partie de mes paramètres, on a commencé à travailler, mais une autre partie arrêt de travail. Permettez-moi de vous donner ma solution de l'histoire:
1.) J'ai indexé mes données en tant que par défaut. Cela signifie, mes données est
analyzed
en tant que par défaut. Ce sera la cause de problème de mon côté. Par exemple;Lorsque l'utilisateur a commencé à rechercher un mot-clé comme SVF-1, système d'exécuter cette requête:
et les résultats;
C'est normal, parce que
name
champ de mes documents sontanalyzed
. Ceci divise requête en jetonsSVF
et1
, etSVF
correspond à mes documents, bien que1
ne correspond pas. J'ai sauté cette façon. J'ai créer un mappage pour mon champs de rendrenot_analyzed
mais mon problème a continué.
2.) J'ai voulu essayer un autre chemin après beaucoup de recherches. Décidé d'utiliser jokers.
Ma question est;
Cette requête a fonctionné, mais un problème ici. Mes champs sont not_analyzed, et de plus, je suis en train de jokers. La casse est le problème ici. Si je recherche comme svf-1, elle ne retourne rien. Depuis, l'utilisateur peut saisir en minuscules version de la requête.
3.) J'ai changé la structure du document;
J'ai adde un champ plus pour
name
appelénameLowerCase
. Quand je suis à l'indexation de mon document, je suis en train de mon document;Ici, je suis la conversion de la requête de mots clés en minuscules et faire des recherches sur de nouveaux
nameLowerCase
index. Et l'affichage dename
champ.Version finale de ma requête;
Maintenant ça fonctionne. Il y a aussi une façon de résoudre ce problème en utilisant multi_field. Ma requête contient un tiret(-), et fait face à certains problèmes.
Beaucoup de grâce à @Alex Brasetvik pour son explication détaillée et des efforts
OriginalL'auteur Hüseyin BABAL
L'ajout de Hüseyin réponse, nous pouvons utiliser ET que l'opérateur par défaut. Afin de SVF et 1* sera joint à l'aide ET de l'opérateur, donc nous donnant des résultats corrects.
OriginalL'auteur Viduranga Wijesooriya
@Viduranga Wijesooriya comme vous l'avez dit
"default_operator" : "AND"
permettra de vérifier la présence de SVF et 1 mais exact match seul n'est toujours pas possible,mais ya cela permettra de filtrer les résultats en plus de manière appropriée laissant avec toutes les combinaison de SVF et 1 et trier les résultats par pertinence, qui permettra de promouvoir le VFS-1 l'ordre
Pour sortir le résultat exact
et la requête est
résultat
OriginalL'auteur Rajan