Mysql
 sql >> база данни >  >> RDS >> Mysql

Кое е най-лесното приложение за търсене в сайта за прилагане, което поддържа размито търсене?

Отговорът на ewemli е в правилната посока, но трябва да комбинирате FULLTEXT и soundex mapping, а не да заменяте пълния текст, в противен случай вашите LIKE заявки вероятно ще бъдат много бавни.

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

Това дава доста добри резултати (в рамките на алгото на soundex), като същевременно се възползват максимално от индекс (всяка заявка КАТО '%foo' трябва да сканира всеки ред в таблицата).

Обърнете внимание на важността на пускането на soundex върху всяка дума, а не върху цялата фраза. Можете също така да стартирате своя собствена версия на soundex за всяка дума, вместо да карате SQL да го прави, но в този случай се уверете, че го правите както при съхранение, така и при извличане, в случай че има разлики между алгоритмите (например, алгото на MySQL не ограничава себе си към стандартния 4 знака )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изберете отделни редове, без да използвате група по оператор

  2. MySQL Заобикаляне на грешка 1093

  3. mysql подреждане на заявката за присъединяване по две колони

  4. Извличане и показване на данни за всеки регистриран потребител в PHP с помощта на PDO

  5. Групиране на таблици в MySQL база данни