sql >> Database >  >> RDS >> Mysql

Wat is de gemakkelijkste sitezoektoepassing om te implementeren, die fuzzy zoeken ondersteunt?

ewemli's antwoord is in de goede richting, maar je zou FULLTEXT en soundex mapping moeten combineren, niet de fulltext vervangen, anders zijn je LIKE-query's waarschijnlijk erg traag.

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

Dat geeft behoorlijk goede resultaten (binnen de limieten van de soundex-algo) terwijl maximaal gebruik wordt gemaakt van een index (elke zoekopdracht LIKE '%foo' moet elke rij in de tabel scannen).

Let op het belang van het uitvoeren van soundex op elk woord, niet op de hele zin. U kunt ook uw eigen versie van soundex op elk woord uitvoeren in plaats van SQL dit te laten doen, maar zorg er in dat geval voor dat u dit zowel bij het opslaan als bij het ophalen doet, voor het geval er verschillen zijn tussen de algoritmen (de algo van MySQL beperkt bijvoorbeeld niet zichzelf naar de standaard 4 tekens )



  1. Querybuilder voegt geen tijdstempels in

  2. Foreach of For - dat is de vraag

  3. Toestemming geweigerd binnen /var/www/html bij het maken van een website en het zijn bestanden met de apache2-server

  4. NULL-waarden binnen de NOT IN-clausule