Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: BamerzaОтветов: 4

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

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

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

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

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

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

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

searchfull-text-searchbooleanescaping

Ответы

Ответ 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)

Ответ 3 · Paxic

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

Ответ 4 · keval dadia

решение::

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

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

ft_min_word_len = "1"
ft_stopword_file =""

ниже

[mysqld]

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы