Как найти двухсимвольное слово с помощью запроса MySQL?

Я использую поиск MySQL FULLTEXT (в режиме естественного языка). Пример:

SELECT Mem_id FROM Members WHERE MATCH (job_title) AGAINST ('".mysql_real_escape_string($keywordsWanted)."')

Я заметил, что поиск "веб-разработчик или "программист PHP" работает не очень хорошо, поэтому я добавил ft_min_word_len=3 в файл конфигурации MySQL (/etc /mysql/my.cnf). Тем не менее, двухсимвольные условия поиска все еще остаются проблемой. например «ИТ-подрядчик», «менеджер по связям с общественностью», «3D дизайн» и т. д. Вот некоторые стратегии, которые я хотел попробовать:

  • Используйте ft_min_word_len=2. Разве это не сделает индекс МАССИВНЫМ и не замедлит работу БД?
  • Изменить запрос, чтобы использовать LIKE в тех случаях, когда ключевое слово содержит менее 3 символов?
  • Автоматически переводите распространенные акронимы в полные слова. например IT->"Информационные технологии"
  • Измените пользовательский интерфейс, чтобы всплывающее окно Javascript предупреждало пользователя о том, что слова из 2 символов не учитываются, поэтому им следует перефразировать вопрос.
  • Перейти к использованию Zend Lucene или другой технологии поиска

Что посоветуете/Как решили эту проблему?


person Tom    schedule 30.07.2009    source источник


Ответы (2)


Для справки, в итоге я изменил «ft_min_word_len=2» в файле конфигурации MySQL (/etc/mysql/my.cnf). Производительность заметно не ухудшилась. Преимущество использования FTS вместо LIKE/REGEXP заключается в автоматическом ранжировании результатов и автоматическом сопоставлении множественного числа.

Кстати, у меня тоже была проблема с некоторыми стоп-словами MYSQL. В частности, «это» и «нас» (потому что они означают «информационные технологии» и «Соединенные Штаты» в моей предметной области). Список стоп-слов для использования можно найти здесь: http://dev.mysql.com/tech-resources/articles/full-text-revealed.html#stopwords. Я сохранил этот список в файл с именем /etc/mysql/stopword_list.txt, а затем добавил «ft_stopword_file='/etc/mysql/stopword_file.txt'» в файл конфигурации MySQL. Затем я перезапустил MYSQL (sudo /etc/init.d/mysqld restart), удалил и воссоздал свой индекс FTS.

person Tom    schedule 05.08.2009
comment
Он не работает с полнотекстовым поиском innodb, мне также нужно добавить innodb_ft_min_token_size = 2, чтобы он работал. - person jbmyid; 14.07.2015

Как насчет поиска с помощью соответствия шаблону mysql LIKE/REGEXP .

Например:

SELECT * FROM Members WHERE job_title LIKE '".$job_title[0]."%';

Или вы можете использовать регулярные выражения:

SELECT * FROM pet WHERE name REGEXP '^.....$';

Вы также можете сохранить название должности в отдельном поле или таблице.

person Leon Fedotov    schedule 30.07.2009
comment
REGEXP, такие как something$, требуют полного сканирования таблицы. - person E Ciotti; 19.02.2013
comment
@ElvisCiotti, это вопрос трехлетней давности, извините за непонимание тогда. - person Leon Fedotov; 19.02.2013
comment
3 года, но вопрос все еще актуален :) - person E Ciotti; 20.03.2013