Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jaka jest najłatwiejsza do wdrożenia aplikacja do wyszukiwania witryn, która obsługuje wyszukiwanie rozmyte?

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 )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zapobiec tworzeniu rekordów, w których wartość dwóch pól jest taka sama?

  2. Wiele tabel LINQ to SQL pozostawiło sprzężenie zewnętrzne

  3. Aktywne rekordy codeigniter dołączyć za pomocą?

  4. Jak używać przy usuwaniu kaskadowym w mysql?

  5. Łatwiejsza konfiguracja do pisania do MySQL na OSX z Pythonem