12.9.6 Настройка полнотекстового поиска MySQL
Возможности полнотекстового поиска MySQL имеют ограниченное количество параметров, настраиваемых пользователем. Вы можете получить больший контроль над поведением полнотекстового поиска, если у вас есть дистрибутив MySQL с исходными кодами, поскольку некоторые изменения требуют модификаций исходного кода. См. Раздел 2.8, «Установка MySQL из исходного кода».
Полнотекстовый поиск тщательно настроен для эффективности. Изменение стандартного поведения в большинстве случаев может фактически снизить эффективность. Не изменяйте исходные коды MySQL, если вы не знаете, что делаете.
Большинство переменных полнотекстового поиска, описанных в этом разделе, должны быть установлены во время запуска сервера. Для их изменения требуется перезапуск сервера; их нельзя изменить во время работы сервера.
Некоторые изменения переменных требуют перестроения индексов FULLTEXT в ваших таблицах. Инструкции по этому вопросу даны позже в этом разделе.
Настройка минимальной и максимальной длины слова
Минимальная и максимальная длина слов для индексирования определяется переменными innodb_ft_min_token_size и innodb_ft_max_token_size для индексов полнотекстового поиска InnoDB и ft_min_word_len и ft_max_word_len для индексов полнотекстового поиска MyISAM.
Минимальная и максимальная длина слова не применяются к индексам FULLTEXT, созданным с помощью парсера ngram. Размер токена ngram определяется параметром ngram_token_size.
После изменения любого из этих параметров необходимо перестроить ваши индексы FULLTEXT, чтобы изменения вступили в силу. Например, чтобы сделать слова из двух символов поисковыми, можно добавить следующие строки в файл параметров:
[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2Затем перезапустите сервер и перестройте ваши индексы FULLTEXT. Для таблиц MyISAM обратите внимание на замечания относительно myisamchk в инструкциях по перестроению индексов MyISAM полнотекстового поиска, приведенных ниже.
Настройка порога поиска на естественном языке
Для индексов полнотекстового поиска MyISAM порог 50% для поиска на естественном языке определяется выбранной схемой взвешивания. Чтобы его отключить, найдите следующую строку в файле storage/myisam/ftdefs.h:
#define GWS_IN_USE GWS_PROB
Измените эту строку на:
#define GWS_IN_USE GWS_FREQ
Затем перекомпилируйте MySQL. В этом случае перестраивать индексы не нужно.
Произведя это изменение, вы существенно уменьшите способность MySQL предоставлять адекватные значения релевантности для функции MATCH(). Если вам действительно нужно искать такие общие слова, лучше использовать IN
BOOLEAN MODE, которая не учитывает порог 50%.
Изменение операторов булевого полнотекстового поиска
Для изменения операторов, используемых для булевых полнотекстовых поисков в таблицах MyISAM, установите системную переменную ft_boolean_syntax. (У таблиц InnoDB нет эквивалентной настройки.) Эту переменную можно изменить во время работы сервера, но у вас должны быть достаточные права для установки глобальных системных переменных (см. Раздел 5.1.8.1, «Права на системные переменные»). В этом случае перестройка индексов не требуется.
Изменения набора символов
Для встроенного парсера полнотекстового поиска вы можете изменить набор символов, рассматриваемых как символы слова, несколькими способами, как описано в следующем списке. После внесения изменения перестройте индексы для каждой таблицы, содержащей любые индексы FULLTEXT. Предположим, что вы хотите рассматривать символ тире ('-') как символ слова. Используйте один из этих методов:
Изменение исходного кода MySQL: В
storage/innobase/handler/ha_innodb.cc(дляInnoDB) или вstorage/myisam/ftdefs.h(дляMyISAM) см. макросыtrue_word_char()иmisc_word_char(). Добавьте'-'в один из этих макросов и перекомпилируйте MySQL.Изменение файла набора символов: Это не требует перекомпиляции. Макрос
true_word_char()использует таблицу “тип символа” для различения букв и цифр от других символов. Вы можете изменить содержимое массива<ctype><map>в одном из XML-файлов набора символов, чтобы указать, что'-'является “буквой”. Затем используйте заданный набор символов для ваших индексовFULLTEXT. Сведения о формате массива<ctype><map>см. в Разделе 10.13.1, «Массивы определения символов».Добавьте новую сортировку для набора символов, используемого индексированными столбцами, и измените столбцы, чтобы использовать эту сортировку. Общие сведения о добавлении сортировок см. в Разделе 10.14, «Добавление сортировки к набору символов». Пример, относящийся к индексированию по полнотексту, см. в Разделе 12.9.7, «Добавление пользовательской сортировки для полнотекстового индексирования».
Перестройка индексов InnoDB полнотекстового поиска
Для того, чтобы изменения вступили в силу, индексы FULLTEXT должны быть перестроены после изменения следующих переменных индексов полнотекстового поиска: innodb_ft_min_token_size; innodb_ft_max_token_size; innodb_ft_server_stopword_table; innodb_ft_user_stopword_table; innodb_ft_enable_stopword; ngram_token_size. Изменение innodb_ft_min_token_size, innodb_ft_max_token_size или ngram_token_size требует перезапуска сервера.
Для перестройки индексов FULLTEXT полнотекстового поиска в таблице InnoDB используйте ALTER TABLE с опциями DROP INDEX и ADD INDEX, чтобы удалить и вновь создать каждый индекс.
Оптимизация индексов InnoDB полнотекстового поиска
Выполнение OPTIMIZE TABLE над таблицей с индексом полнотекстового поиска перестраивает индекс полнотекстового поиска, удаляя удалённые идентификаторы документов и объединяя несколько записей для одного и того же слова, где это возможно.
Для оптимизации индекса полнотекстового поиска включите innodb_optimize_fulltext_only и выполните OPTIMIZE TABLE.
mysql> set GLOBAL innodb_optimize_fulltext_only=ON;
Query OK, 0 rows affected (0.01 sec)
mysql> OPTIMIZE TABLE opening_lines;
+--------------------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------+----------+----------+----------+
| test.opening_lines | optimize | status | OK |
+--------------------+----------+----------+----------+
1 row in set (0.01 sec) Чтобы избежать длительных времен перестройки индексов полнотекстового поиска в больших таблицах, вы можете использовать опцию innodb_ft_num_word_optimize для выполнения оптимизации поэтапно. Опция innodb_ft_num_word_optimize определяет количество слов, которые оптимизируются каждый раз при выполнении OPTIMIZE TABLE. Значение по умолчанию составляет 2000, что означает, что каждый раз при выполнении OPTIMIZE
TABLE оптимизируются 2000 слов. Последующие операции OPTIMIZE TABLE продолжаются с того места, где закончилась предыдущая операция OPTIMIZE TABLE.
Перестройка индексов MyISAM полнотекстового поиска
Если вы изменяете переменные полнотекстового поиска, влияющие на индексирование (ft_min_word_len, ft_max_word_len или ft_stopword_file), или если вы изменяете сам файл стоп-слов, необходимо перестроить ваши FULLTEXT индексы после внесения изменений и перезапуска сервера.
Для перестройки FULLTEXT индексов для таблицы MyISAM достаточно выполнить операцию ремонта QUICK:
mysql> REPAIR TABLE tbl_name QUICK;
В качестве альтернативы можно использовать ALTER TABLE, как описано выше. В некоторых случаях это может быть быстрее, чем операция ремонта.
Каждая таблица, содержащая FULLTEXT индекс, должна быть отремонтирована, как показано выше. В противном случае запросы к таблице могут давать неверные результаты, а изменения в таблице приведут к тому, что сервер посчитает таблицу повреждённой и требующей ремонта.
Если вы используете myisamchk для выполнения операции, изменяющей MyISAM индексы таблиц (например, ремонт или анализ), FULLTEXT индексы перестраиваются с использованием стандартных значений параметров полнотекстового поиска для минимальной длины слова, максимальной длины слова и файла стоп-слов, если вы не укажете иначе. Это может привести к ошибке запросов.
Проблема возникает, потому что эти параметры известны только серверу. Они не хранятся в файлах MyISAM индексов. Чтобы избежать проблемы, если вы изменили значения минимальной или максимальной длины слова или файла стоп-слов, используемые сервером, укажите те же значения ft_min_word_len, ft_max_word_len и ft_stopword_file для myisamchk, что вы используете для mysqld. Например, если вы установили минимальную длину слова в 3, вы можете отремонтировать таблицу с помощью myisamchk следующим образом:
myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
Чтобы гарантировать, что myisamchk и сервер используют одинаковые значения для параметров полнотекстового поиска, поместите каждое из них как в [mysqld], так и в [myisamchk] разделах файла опций:
[mysqld]
ft_min_word_len=3
[myisamchk]
ft_min_word_len=3
Альтернативой использованию myisamchk для изменения индексов таблицы MyISAM является использование команд REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE или ALTER TABLE. Эти команды выполняются сервером, который знает, какие значения параметров полнотекстового поиска следует использовать.
© 2025 Oracle
Licensed under the GPLv2 License.