Самое простое приложение для поиска по сайту, которое поддерживает нечеткий поиск?

У меня есть сайт, который нужно искать через около 20-30 тыс. Записей, которые в основном относятся к фильмам и ТВ-шоу. На сайте выполняется php / mysql с memcache.

Я FULLTEXT заменить FULLTEXT на FULLTEXT soundex() который у меня есть, который работает … вроде, но не очень хорош во многих ситуациях.

Есть ли достойные сценарии поиска, которые просты в реализации, и обеспечит достойную возможность поиска (из 3 столбцов в таблице).

Related of "Самое простое приложение для поиска по сайту, которое поддерживает нечеткий поиск?"

Ответ ewemli находится в правильном направлении, но вы должны комбинировать FULLTEXT и отображение soundex, не заменяя полный текст, в противном случае ваши запросы 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 algo) при максимальном использовании индекса (любой запрос LIKE «% foo» должен сканировать каждую строку в таблице).

Обратите внимание на важность запуска soundex для каждого слова, а не для всей фразы. Вы также можете запускать свою собственную версию soundex для каждого слова, а не делать SQL, но в этом случае убедитесь, что вы выполняете это как при сохранении, так и при извлечении, если есть различия между алгоритмами (например, Алгоритм MySQL не ограничивает к стандартным 4 символам )

Если вы ищете простое существующее решение вместо создания своего собственного решения, проверьте

  • Sphider.eu
  • PHPDig

В mysql есть функция SOUNDEX. Если вы хотите найти название фильма:

 select * from movie where soundex(title) = soundex( 'the title' ); 

Конечно, это не работает, чтобы искать в тексте, например, просмотр фильма или сюжета.


Soundex – относительно простой алгоритм . Вы также можете решить все это на прикладном уровне, это может быть проще:

  • при сохранении текста, tokenize его и применить soundex для всех слов
  • сохранить исходный текст и версию soundex в двух столбцах
  • при поиске, вычислите soundex в приложении. и затем использовать обычный LIKE на уровне db.

Soundex имеет ограничения для работы с нечетким поиском. Лучшей функцией является расстояние редактирования, которое может быть интегрировано в MySQL с использованием UDF. Проверьте http://flamingo.ics.uci.edu/toolkit/ для реализации C ++ для MySQL на Linux.