Un lecteur de mon site (Romain D.) m'a soumis un patch permettant la recherche par levenshtein et soundex dans les tags (ce qui permet de trouver, par exemple, "wikipedia" quand on tape "wikipdia", ou bien "programme" quand on tape "praugrame") Mais il faudra que j'évalue:
- si c'est applicable sur la recherche fulltext ou seulement sur les tags.
- lesquelles utiliser (levenshtein, soundex, metaphone, similar_text...)
- et comment les combiner pour obtenir de meilleurs résultats (par exemple calculer le levenshtein sur les chaînes soundex ou metaphone)
- si elle sont adaptées au français et à d'autres langues
- si elles supportent un mélange de langues sans trop de dégats.
- si elles supportent l'UTF-8.
- combien elles consomment en CPU (il faut que ça reste raisonnable).
- *quand* activer cette recherche (si aucun résultat avec la comparaisons stricte, si moins de X résultats ?)
Ben j'ai du boulot en perspective...
Notes en vrac pour moi (ajoutés au fur et à mesure).
Versions du Soundex mieux adaptés aux français:
http://blog.mymind.fr/post/2007/03/15/Soundex-Francais
http://www.roudoudou.com/php/phonetic.php
http://web.archive.org/web/20050209205529/http://www.php-help.net/sources-php/a.french.adapted.soundex.289.html
Il existe des versions améliorées de Levenshtein consommant moins de mémoire et plus rapides: Voir les commentaires de la fonction levenshtein sur le manuel php.
A vue de nez:
- metaphone est meilleur que Soundex (soundex est mal adapté au français, est limité à 4 caractères, ne prend pas en compte le premier caractère).
- metaphone semble meilleur que phonetique() (en tous cas pour calculer un levenshtein dessus).
- d'après diverses lectures, la meilleure solution semble être de calculer le metaphone, puis de calculer le levenstein dessus et ramener le tout à la longueur du mot. On obtient un pourcentage qu'on utilise pour trier les mots les plus proches. ---> renvoyer (si possible) les résultats triés par similarité (les plus similaires en premier).
EDIT: Le double-metaphone semble intéressant. Il est adapté à d'autres langues que l'anglais (langues slaves, germaniques, grec, français, Italien, espagnol, chinois et autres):
http://fr.wikipedia.org/wiki/Double_Metaphone
Implémentation en php:
http://swoodbridge.com/DoubleMetaPhone/
/!\ DoubleMetaphone est limité à 4 caractères en sortie, alors que Metaphone ne l'est pas.
EDIT: Tester aussi Phonex:
http://www.phpclasses.org/package/2974-PHP-Implementation-of-the-phonex-algorithm-for-French.html (loguez-vous avec
http://bugmenot.com/)