Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Was ist die am einfachsten zu implementierende Website-Suchanwendung, die Fuzzy-Suche unterstützt?

ewemlis Antwort geht in die richtige Richtung, aber Sie sollten FULLTEXT und Soundex-Mapping kombinieren und nicht den Volltext ersetzen, sonst sind Ihre LIKE-Abfragen wahrscheinlich sehr langsam.

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

Das liefert ziemlich gute Ergebnisse (innerhalb der Grenzen des Soundex-Algorithmus), während es einen Index maximal ausnutzt (jede Abfrage LIKE '%foo' muss jede Zeile in der Tabelle scannen).

Beachten Sie, wie wichtig es ist, Soundex für jedes Wort auszuführen, nicht für den gesamten Satz. Sie könnten auch Ihre eigene Version von Soundex für jedes Wort ausführen, anstatt SQL dies tun zu lassen, aber stellen Sie in diesem Fall sicher, dass Sie dies sowohl beim Speichern als auch beim Abrufen tun, falls es Unterschiede zwischen den Algorithmen gibt (zum Beispiel beschränkt der Algorithmus von MySQL nicht selbst zum Standard 4 Zeichen )