Как заставить ваш полнотекстовый логический поиск улавливать термин C ++?

Итак, мне нужно выяснить, как выполнить полнотекстовый логический поиск в базе данных MySQL, чтобы вернуть запись, содержащую термин «C ++».

У меня есть строка поиска SQL как:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ("C++" IN BOOLEAN MODE) 

Хотя все мои поля содержат строку C ++, она никогда не возвращается в результатах поиска.

Как я могу изменить MySQL, чтобы приспособиться к этому? Является ли это возможным?

Единственное решение, которое я нашел, - это избежать символа + во время ввода моих данных как что-то вроде «__plus», а затем изменить мой поиск для соответствия, но это кажется громоздким и должен быть лучший способ.


person Bamerza    schedule 25.02.2009    source источник
comment
Что, черт возьми, такое полнотекстовый логический поиск? Это ужасно похоже на то, что вы придумали это слово. Кроме того, ваш вопрос очень расплывчатый. Вам нужно лучше описать вашу проблему и то, что вы пытаетесь сделать. В противном случае мы не сможем вам помочь.   -  person John Leidegren    schedule 25.02.2009
comment
@ Джон: Ты очень резок. Мне пришлось воздержаться от ссылки на lmgtfy, поэтому вот объяснение из MySQL: dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html   -  person A. Rex    schedule 25.02.2009
comment
@A. Рекс: Я злой (в некотором смысле), моя точка зрения кажется резкой, но не хватает вопроса о том, как бы вы сформулировали хороший вопрос. Таким образом, мы (люди, занимающиеся переполнением стека) не можем дать хороший ответ на основе недостаточной информации.   -  person John Leidegren    schedule 25.02.2009
comment
@A. Рекс - Чтобы проиллюстрировать мою точку зрения, во многих случаях вопрос неверен. Но если вы правильно сформулируете свой вопрос, люди с достаточным опытом смогут сказать, что вы работаете под неправильным углом. И это даст вам лучшее представление о будущем.   -  person John Leidegren    schedule 25.02.2009
comment
Этот термин хорошо известен пользователям MySQL, у которых достаточно знаний, чтобы ответить на этот вопрос.   -  person bobince    schedule 25.02.2009
comment
@John Fulltext boolean - хорошее описание хорошо известного типа поиска MySQl.   -  person Mazatec    schedule 07.02.2011
comment
@Myself - Ну, это действительно заставляет меня чувствовать себя идиотом, и это правильно ...   -  person John Leidegren    schedule 14.02.2011


Ответы (4)


Как я могу изменить MySQL, чтобы приспособиться к этому?

Вам придется изменить представление MySQL о том, что такое слово.

Во-первых, минимальная длина слова по умолчанию - 4. Это означает, что ни один поисковый запрос, содержащий только слова из ‹4 букв, никогда не будет соответствовать, будь то« C ++ »или« cpp ». Вы можете настроить это с помощью ft_min_word_len вариант конфигурации, например. в вашем my.cfg:

[mysqld]
ft_min_word_len=3

(Затем остановите / запустите MySQLd и перестройте полнотекстовые индексы.)

Во-вторых, MySQL не считает букву "+". Вы можете превратить его в букву, но тогда это означает, что вы не сможете искать слово «рыба» в строке «рыба + чипсы», поэтому потребуется некоторая осторожность. И это нетривиально: требуется перекомпиляция MySQL или взлом существующего набора символов. См. Начало раздела «Если вы хотите изменить набор символов, которые считаются словесными ...» в раздел 11.8.6 документа.

экранировать символ + во время ввода моих данных как что-то вроде "__plus", а затем изменить мой поиск, чтобы он соответствовал

Да, что-то подобное является распространенным решением: вы можете хранить свои «настоящие» данные (без экранирования) в первичной окончательной таблице - обычно с использованием InnoDB для соответствия ACID. Затем может быть добавлена ​​вспомогательная таблица MyISAM, содержащая только искаженные слова для приманки полнотекстового поиска. Используя этот подход, вы также можете выполнить ограниченную форму стемминга.

Другая возможность - обнаружить поисковые запросы, которые MySQL не может выполнить, например, поиск только с короткими словами или необычными символами, и вернуться к простому, но медленному поиску LIKE или REGEXP только для этих поисков. В этом случае вы, вероятно, также захотите удалить список стоп-слов, установив ft_stopword_file в пустую строку, так как нецелесообразно воспринимать все в ней как особенное.

person bobince    schedule 25.02.2009
comment
@bobince: (Повторите обсуждение в комментариях выше, спасибо за четкий ответ на этот понятный вопрос.) Из любопытства, как бы вы справились с этим подходом? Заменить каждое слово во вспомогательной таблице его основой? - person A. Rex; 25.02.2009
comment
По сути, да (обработка слов в поисковых запросах, конечно, аналогична). Обычно вы должны использовать существующую библиотеку стеммеров с удалением суффиксов для предпочитаемых вами языков. (Для обоих значений «язык»; см., Например, алгоритм Портера для английского языка на многих языках программирования.) - person bobince; 25.02.2009

Из http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html:

Фраза, заключенная в двойные кавычки («" »), соответствует только строкам, которые содержат фразу буквально в том виде, в котором она была набрана.

Это означает, что вы можете искать «C ++», используя этот запрос:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ('"C++"' IN BOOLEAN MODE)
person Community    schedule 14.08.2009

Обычно экранированные символы используются в запросе, а не в данных базы данных. Попробуйте экранировать каждый знак "+" в своем запросе.

person Paxic    schedule 25.02.2009

решение::

изменить файл my.ini

поместите эти две строки

ft_min_word_len = "1"
ft_stopword_file =""

ниже

[mysqld]

чем сохранить файл и перезапустить сервер mysql.

my.ini файл будет доступен всем. так можем ли мы вносить изменения в my.ini файл только для некоторого сеанса?

person keval dadia    schedule 06.12.2010