Как мне найти двухсимвольное слово, используя запрос MySQL? - PullRequest
1 голос
/ 30 июля 2009

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

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

Я заметил, что поиск " web developer" или " PHP coder" не работает должным образом, поэтому я добавил ft_min_word_len=3 в файл конфигурации MySQL ( / и т.д. / MySQL / my.cnf ). Тем не менее, двухсимвольные условия поиска по-прежнему являются проблемой. например " IT подрядчик", " PR менеджер", " 3D дизайн" и т. Д. Вот некоторые стратегии, о которых я подумал:

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

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

Ответы [ 2 ]

3 голосов
/ 05 августа 2009

Для справки я в итоге изменил "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.

2 голосов
/ 30 июля 2009

Как насчет поиска с совпадением с шаблоном mysql LIKE / REGEXP.

Например:

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...