Comment pouvez-vous implémenter "Avez-vous voulu dire:" Comme Google le fait dans certaines Queries de recherche ? P>
ps: strong> J'utilise Sphinx dans mon produit. Pouvez-vous suggérer comment puis-je mettre en œuvre cela? Tous les guides ou suggestions pour d'autres moteurs de recherche qui ont cette fonctionnalité sont les plus accueillis.
J'utilise des rails2.3.8, si cela aide em> p>
Faire un dictionnaire de "mots-clés" ou "phrases" connus, et dans l'action de recherche si rien ne se trouve alors exécutez une requête secondaire dans ce dictionnaire. Mettre à jour ce dictionnaire chaque fois qu'une entrée interrogeable est créée, par exemple, un poteau de blog ou un nom d'utilisateur. P>
Query = "Supreman" P> Li>
Dictionnaire = ["Superman", "Batman", "Hanuman" ...] (dans la table DB) P> Li>
recherche (requête) p> li>
si aucun résultat, alors p> li>
ul>
Rechercher dans le dictionnaire (où "mot-clé" comme requête ou "phrase" comme requête) => "superman" p>
Vérification de la documentation Sphinx ou Solr. Ils pourraient avoir une meilleure mise en œuvre de cette requête "comme" qui renvoie une correspondance%. P>
Mais le point est de savoir comment le rendre efficace? P>
5 Réponses :
Je pense que vous recherchez un algorithme de match de chaîne. p>
Je me souviens Gist Mislav utilisé pour soulever des erreurs lorsque initialiser em> était légèrement mal orthographié . Cela pourrait être une bonne lecture. P>
En outre, jetez un coup d'œil à certains articles qu'il suggère: p>
N'y a-t-il pas une solution intégrée ou une addon GEM pour les moteurs de recherche de texte complet?
Si je devais mettre en œuvre cela, je commencerais par regarder pg_trgm Code>
, puisque la plupart de mes applications utilisent déjà PostgreSQL. Lorsque j'ai vérifié, Sphinx n'a pas de recherche floue comme celle-ci, sauf comme prévu par Stumming.
Regardez le Damerau-Levenshtein Algorithme de distance. Il calcule la "distance" entre deux chaînes et détermine le nombre d'étapes qu'il faut pour transformer une chaîne en une autre. Moins les étapes sont les plus proches des deux cordes. P>
Cet article montre l'algorithme mis en œuvre comme une MySQL stockée fonction. p>
L'algorithme est tellement meilleur que comme ou Soundex. P>
Je crois que Google utilise des données sur la foule plutôt qu'un algorithme. C'est-à-dire si un utilisateur Types d'ABCD, clique sur le bouton arrière, puis effectue une recherche immédiatement sur ABD, elle établit une relation entre les deux termes de recherche car l'utilisateur n'était pas satisfait des résultats. Une fois que vous avez une très grande recherche de la communauté, le motif apparaît. P>
Lien d'article Retours 404
@ CHCHANAL118 FORMÉ
Vous devez jeter un coup d'œil à la théorie réelle de la manière dont Google implémente quelque chose comme ceci: Comment écrire une orthographe Correcteur . P>
Bien que cet article soit écrit en Python, il existe des liens vers des implémentations dans d'autres langues au bas de l'article. Voici un implémentation de rubis < / a>. p>
Maintenant, un jour avez-vous signé la fonctionnalité est implémentée sur la base de correcteur phonétique des sorts. Lorsque nous manquons, nous écrivons généralement des mots phonétiquement similaires. Basé sur cette idée correctrice phonétique des sorts recherchent sa base de données pour le mot le plus similaire. Les liens de similarité sont cassés en utilisant le contexte (pour une requête à plusieurs mots, d'autres mots aident également à décider du mot correct) et de la popularité du mot. Si deux mots sont phonétiquement très proches du mot mal orthographié que le mot qui correspond au contexte et est plus fréquemment utilisé dans la vie quotidienne est choisi. p>
Ceci fonctionne pour moi:
SELECT * FROM table_name WHERE soundex(field_name) LIKE CONCAT('%', soundex('searching_element'), '%')
Quoi qu'il en soit, vous pouvez fournir des exemples de ce qui correspond à la correspondance basée sur le terme de recherche? Vous recherchez des choses qui correspondent à des caractères transposés auraient probablement probablement ceci, par exemple: rechercher ALGP au lieu d'ALPG lorsque ALPG et Alfg étaient disponibles pour rechercher.