Итак, мне нужно выяснить, как выполнить полнотекстовый логический поиск в базе данных MySQL, чтобы вернуть запись, содержащую термин "C ++".
У меня есть строка поиска SQL как:
SELECT *
FROM mytable
WHERE MATCH (field1, field2, field3)
AGAINST ("C++" IN BOOLEAN MODE)
Хотя все мои поля содержат строку C ++, она никогда не возвращается в результатах поиска.
Как я могу изменить MySQL, чтобы приспособиться к этому? Является ли это возможным?
Единственное решение, которое я нашел, - это избежать символа + во время ввода моих данных как что-то вроде "__plus", а затем изменить мой поиск для соответствия, но это кажется громоздким и должен быть лучший способ.
Ответ 1 · рейтинг 8 · bobince
Как я могу изменить 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 в пустую строку, так как нецелесообразно воспринимать все в ней как особенное.
Ответ 2 · рейтинг 1 · Community
Из 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)
Ответ 4 · keval dadia
решение::
изменить файл my.ini
поместите эти две строки
ft_min_word_len = "1"
ft_stopword_file =""
ниже
[mysqld]
чем сохранить файл и перезапустить сервер mysql.
my.ini файл будет доступен всем. так можем ли мы вносить изменения в my.ini файл только для некоторого сеанса?