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

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

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

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

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

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

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

Ответов (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 в пустую строку, так как нецелесообразно брать все в этом как особенное.

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

Из 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)

решение::

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

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

ft_min_word_len = "1"
ft_stopword_file =""

ниже

[mysqld]

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

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