Odpowiedź Ewemli jest we właściwym kierunku, ale powinieneś łączyć mapowanie FULLTEXT i soundex, a nie zastępować pełny tekst, w przeciwnym razie Twoje zapytania LIKE będą prawdopodobnie bardzo wolne.
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 |
+----+--------------------------------+---------------------------+
Daje to całkiem dobre wyniki (w granicach algorytmu soundex), przy maksymalnym wykorzystaniu indeksu (każde zapytanie LIKE '%foo' musi skanować każdy wiersz w tabeli).
Zwróć uwagę na to, jak ważne jest uruchamianie soundexu na każdym słowie, a nie na całej frazie. Możesz także uruchomićwłasnąwersjęsoundexu dla każdego słowa zamiast robić to SQL, ale w takim przypadku upewnij się, że robisz to zarówno podczas przechowywania, jak i pobierania na wypadek, gdyby wystąpiły różnice między algorytmami (na przykład algorytm MySQL nie ogranicza się do standardowego 4 znaki )