Как вы получаете свой полнотекстовый логический поиск, чтобы подобрать термин C ++? - PullRequest
8 голосов
/ 25 февраля 2009

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

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

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 25 февраля 2009

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

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

Во-первых, минимальная длина слова по умолчанию равна 4. Это означает, что ни один поисковый термин, содержащий только слова <4 букв, никогда не будет совпадать, будь то "C ++" или "cpp". Вы можете настроить это, используя опцию конфигурации <a href="http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_ft_min_word_len" rel="noreferrer"> 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 в пустую строку, так как нецелесообразно выбирать все в этом как особенное.

1 голос
/ 14 августа 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)
0 голосов
/ 06 декабря 2010

решение ::

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

поставить эти две строки

ft_min_word_len = "1"
ft_stopword_file =""

ниже * * 1 010

[mysqld]

Затем сохраните файл и перезапустите сервер MySQL.

Файл

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

0 голосов
/ 25 февраля 2009

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

...