sql >> Databáze >  >> RDS >> Mysql

Jaká je nejjednodušší implementace aplikace pro vyhledávání na stránkách, která podporuje fuzzy vyhledávání?

ewemliho odpověď je správným směrem, ale měli byste kombinovat FULLTEXT a soundex mapování a nenahrazovat fulltext, jinak budou vaše LIKE dotazy pravděpodobně velmi pomalé.

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

To dává docela dobré výsledky (v mezích soundex algo) při maximálním využití indexu (jakýkoli dotaz LIKE '%foo' musí prohledat každý řádek v tabulce).

Všimněte si důležitosti spuštění soundexu u každého slova, ne u celé fráze. Můžete také spustit svou vlastní verzi soundexu pro každé slovo, místo aby to dělal SQL, ale v takovém případě se ujistěte, že to děláte jak při ukládání, tak při načítání v případě, že existují rozdíly mezi algoritmy (například algoritmus MySQL neomezuje sám na standardní 4 znaky )



  1. Postgres ručně mění sekvenci

  2. Získejte data o počtu z Firebase, jako je MySQL

  3. php pdo získá pouze jednu hodnotu z mysql; hodnota, která se rovná proměnné

  4. Jak funguje funkce LCASE() v MySQL