ElasticSearch - La Recherche De L'Homme Noms
J'ai une grande base de données de noms, principalement à partir de l'Ecosse. Nous sommes actuellement à la production d'un prototype de remplacer une pièce de logiciel qui effectue la recherche. C'est toujours en production et nous visons à obtenir nos résultats aussi ferme que possible les résultats actuels de la recherche.
J'espérais que quelqu'un pourrait m'aider, je suis d'entrer dans une recherche en Élastique de Recherche, la requête est "Michael Heaney", je reçois quelques sauvages résultats. Le courant de recherche renvoie les deux principaux noms de famille, ce sont - le "Heaney" et "Heavey" tous avec le prénom de "Michael", je peux obtenir le "Heaney" les résultats d'Elastic Search cependant je ne peux pas obtenir "Heavey" et ES renvoie également à des personnes sans nom "Michael" cependant je comprends que c'est parce qu'elle est la partie de la requête floue. Je sais que c'est une étroite cas d'utilisation, comme c'est une seule recherche, mais l'obtention de ce résultat et de savoir comment je peux obtenir de l'aide.
Grâce.
Cartographie
{
"jr": {
"_all": {
"enabled": true,
"index_analyzer": "index_analyzer",
"search_analyzer": "search_analyzer"
},
"properties": {
"pty_forename": {
"type": "string",
"index": "analyzed",
"boost": 2,
"index_analyzer": "index_analyzer",
"search_analyzer": "search_analyzer",
"store": "yes"
},
"pty_full_name": {
"type": "string",
"index": "analyzed",
"boost": 4,
"index_analyzer": "index_analyzer",
"search_analyzer": "search_analyzer",
"store": "yes"
},
"pty_surname": {
"type": "string",
"index": "analyzed",
"boost": 4,
"index_analyzer": "index_analyzer",
"search_analyzer": "search_analyzer",
"store": "yes"
}
}
}
}'
Paramètres D'Indexation
{
"settings": {
"number_of_shards": 2,
"number_of_replicas": 0,
"analysis": {
"analyzer": {
"index_analyzer": {
"tokenizer": "standard",
"filter": [
"standard",
"my_delimiter",
"lowercase",
"stop",
"asciifolding",
"porter_stem",
"my_metaphone"
]
},
"search_analyzer": {
"tokenizer": "standard",
"filter": [
"standard",
"my_metaphone",
"synonym",
"lowercase",
"stop",
"asciifolding",
"porter_stem"
]
}
},
"filter": {
"synonym": {
"type": "synonym",
"synonyms_path": "synonyms/synonyms.txt"
},
"my_delimiter": {
"type": "word_delimiter",
"generate_word_parts": true,
"catenate_words": false,
"catenate_numbers": false,
"catenate_all": false,
"split_on_case_change": false,
"preserve_original": false,
"split_on_numerics": false,
"stem_english_possessive": false
},
"my_metaphone": {
"type": "phonetic",
"encoder": "metaphone",
"replace": false
}
}
}
}
}'
Floue
{
"from":0, "size":100,
"query": {
"bool": {
"should": [
{
"fuzzy": {
"pty_surname": {
"min_similarity": 0.2,
"value": "Heaney",
"prefix_length": 0,
"boost": 5
}
}
},
{
"fuzzy": {
"pty_forename": {
"min_similarity": 1,
"value": "Michael",
"prefix_length": 0,
"boost": 1
}
}
}
]
}
}
}
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, j'ai recréé votre configuration actuelle dans le Jeu: https://www.found.no/play/gist/867785a709b4869c5543
Si vous y allez, passez à "l'Analyse"-onglet pour voir comment le texte est transformé:
Note, par exemple, que
Heaney
finit sous forme de jeton comme[hn, heanei]
avec lesearch_analyzer
et comme[HN, heanei]
avec leindex_analyzer
. Remarque le cas-différence pour le metaphone terme. Ainsi, que l'on n'est pas de correspondance.La
fuzzy
-requête ne pas faire de requête de temps d'analyse de texte. Ainsi, vous vous retrouvez en comparantHeavey
avecheanei
. Cela a un Distance de damerau-Levenshtein plus que ce que vos paramètres.Ce que vous voulez vraiment, c'est à l'aide de l'floue fonctionnalité de
match
. Match ne n'moment de la requête d'analyse de texte, et a un flou-paramètre.Comme pour le
fuzziness
, cela a changé un peu dans Lucene 4. Avant, il était généralement spécifié comme un float. Maintenant, il convient de préciser que le permis à distance. Il y a une circulation pull request à préciser que: https://github.com/elasticsearch/elasticsearch/pull/4332/filesLa raison pourquoi vous obtenez les gens sans le prénom
Michael
est que vous faites unbool.should
. Cela a OU-sémantique. Il suffit que l'un des matchs, mais la notation-sage, il est mieux de le plus de matchs.Enfin, la combinaison de tous que le filtrage dans le même terme n'est pas nécessairement la meilleure approche. Par exemple, vous ne pouvez pas savoir et de stimuler l'orthographe exacte. Ce que vous devriez envisager est l'aide d'un multi_field pour traiter le champ à bien des égards.
Voici un exemple, vous pouvez jouer avec, avec le curl commandes de recréer ci-dessous. J'aimerais passer à l'aide de la "porter" stemmer entièrement pour ce faire, cependant. Je l'ai gardé juste pour montrer comment multi_field œuvres. En utilisant une combinaison de match, de match avec le flou et la phonétique correspondant devrait aller loin. (Assurez-vous que vous ne laissez pas le flou lorsque vous ne phonétique correspondant ou vous aurez inutilement la correspondance floue. 🙂