Mysql
 sql >> Database >  >> RDS >> Mysql

Qual è l'applicazione di ricerca su sito più semplice da implementare che supporta la ricerca fuzzy?

La risposta di ewemli è nella giusta direzione, ma dovresti combinare FULLTEXT e soundex mapping, non sostituire il fulltext, altrimenti le tue query LIKE saranno probabilmente molto lente.

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 | 
+----+--------------------------------+---------------------------+

Ciò fornisce risultati piuttosto buoni (entro i limiti dell'algoritmo soundex) sfruttando al massimo un indice (qualsiasi query LIKE '%foo' deve scansionare ogni riga della tabella).

Nota l'importanza di eseguire soundex su ogni parola, non sull'intera frase. Potresti anche eseguire la tua versione di soundex su ogni parola piuttosto che fare in modo che SQL lo faccia, ma in tal caso assicurati di farlo sia durante l'archiviazione che durante il recupero nel caso ci siano differenze tra gli algoritmi (ad esempio, l'algoritmo di MySQL non limita stesso allo standard 4 caratteri )