sql >> Databasteknik >  >> RDS >> Mysql

Vilken är den enklaste webbplatssökningsapplikationen att implementera, som stöder fuzzy sökning?

ewemlis svar är i rätt riktning men du bör kombinera FULLTEXT och soundex-mappning, inte ersätta fulltexten, annars är dina LIKE-frågor troligen väldigt långsamma.

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

Det ger ganska bra resultat (inom gränserna för soundex-algon) samtidigt som man drar maximal nytta av ett index (alla frågor LIKE '%foo' måste skanna varje rad i tabellen).

Observera vikten av att köra soundex på varje ord, inte på hela frasen. Du kan också köra din egen version av soundex på varje ord istället för att låta SQL göra det, men i så fall se till att du gör det både när du lagrar och hämtar ifall det finns skillnader mellan algoritmerna (till exempel MySQL:s algo begränsar inte sig till standard 4 tecken )



  1. Säkerhetskopiera Mysql-databaser

  2. ConnectionString-egenskapen har inte initierats fel

  3. Python SQLAlchemy - MySQL-servern har försvunnit

  4. Jetty 7 + MySQL Config [java.lang.ClassNotFoundException:org.mortbay.jetty.webapp.WebAppContext]