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

Hvad er det nemmeste webstedssøgningsprogram at implementere, som understøtter fuzzy søgning?

ewemlis svar er i den rigtige retning, men du bør kombinere FULLTEXT og soundex mapping, ikke erstatte fuldteksten, ellers er dine LIKE-forespørgsler sandsynligvis meget langsomme.

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 giver ret gode resultater (inden for grænserne af soundex-algoen) og samtidig udnytter et indeks maksimalt (enhver forespørgsel LIKE '%foo' skal scanne hver række i tabellen).

Bemærk vigtigheden af ​​at køre soundex på hvert ord, ikke på hele sætningen. Du kan også køre din egen version af soundex på hvert ord i stedet for at lade SQL gøre det, men i så fald skal du sørge for at gøre det både ved lagring og hentning, hvis der er forskelle mellem algoritmerne (f.eks. begrænser MySQL's algo ikke sig til standard 4 tegn )



  1. Tjek WordPress hashed adgangskode med almindelig adgangskode

  2. DBX-fejl:Driveren kunne ikke initialiseres korrekt

  3. Hvordan adresserer jeg OSError:mysql_config ikke fundet fejl under installation af Elastic Beanstalk?

  4. Hvordan sender jeg adgangskoden til pg_dump?