Mysql
 sql >> Base de données >  >> RDS >> Mysql

Quelle est l'application de recherche de site la plus facile à mettre en œuvre, qui prend en charge la recherche floue ?

La réponse d'ewemli va dans la bonne direction, mais vous devriez combiner FULLTEXT et le mappage soundex, sans remplacer le texte intégral, sinon vos requêtes LIKE seront probablement très lentes.

create table with_soundex (
  id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  original TEXT,
  soundex TEXT,
  FULLTEXT (soundex)
);

insert into with_soundex (original, soundex) values 

('add some test cases', CONCAT_WS(' ', soundex('add'), soundex('some'), soundex('test'), soundex('cases'))),
('this is some text', CONCAT_WS(' ', soundex('this'), soundex('is'), soundex('some'), soundex('text'))),
('one more test case', CONCAT_WS(' ', soundex('one'), soundex('more'), soundex('test'), soundex('case'))),
('just filling the index', CONCAT_WS(' ', soundex('just'), soundex('filling'), soundex('the'), soundex('index'))),
('need one more example', CONCAT_WS(' ', soundex('need'), soundex('one'), soundex('more'), soundex('example'))),
('seems to need more', CONCAT_WS(' ', soundex('seems'), soundex('to'), soundex('need'), soundex('more')))
('some helpful cases to consider', CONCAT_WS(' ', soundex('some'), soundex('helpful'), soundex('cases'), soundex('to'), soundex('consider')))

select * from with_soundex where match(soundex) against (soundex('test'));
+----+---------------------+---------------------+
| id | original            | soundex             |
+----+---------------------+---------------------+
|  1 | add some test cases | A300 S500 T230 C000 | 
|  2 | this is some text   | T200 I200 S500 T230 | 
|  3 | one more test case  | O500 M600 T230 C000 | 
+----+---------------------+---------------------+

select * from with_soundex where match(soundex) against (CONCAT_WS(' ', soundex('test'), soundex('some')));
+----+--------------------------------+---------------------------+
| id | original                       | soundex                   |
+----+--------------------------------+---------------------------+
|  1 | add some test cases            | A300 S500 T230 C000       | 
|  2 | this is some text              | T200 I200 S500 T230       | 
|  3 | one more test case             | O500 M600 T230 C000       | 
|  7 | some helpful cases to consider | S500 H414 C000 T000 C5236 | 
+----+--------------------------------+---------------------------+

Cela donne de très bons résultats (dans les limites de l'algo soundex) tout en profitant au maximum d'un index (toute requête LIKE '%foo' doit parcourir chaque ligne de la table).

Notez l'importance d'exécuter soundex sur chaque mot, pas sur la phrase entière. Vous pouvez également exécuter votre propre version de soundex sur chaque mot plutôt que de laisser SQL le faire, mais dans ce cas, assurez-vous de le faire à la fois lors du stockage et de la récupération au cas où il y aurait des différences entre les algorithmes (par exemple, l'algo de MySQL ne limite pas lui-même au standard 4 caractères )