14.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 не имеет эквивалентной настройки.) Эту переменную можно изменить во время работы сервера, но у вас должны быть соответствующие привилегии для установки глобальных системных переменных (см. Раздел 7.1.9.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>, см. Раздел 12.13.1, «Массивы определения символов».Добавление новой сортировки для набора символов, используемого столбцами с индексами, и изменение столбцов для использования этой сортировки. Для общей информации о добавлении сортировок, см. Раздел 12.14, «Добавление сортировки в набор символов». Для примера, специфичного для индексирования полнотекстового поиска, см. Раздел 14.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, что означает оптимизацию 2000 слов каждый раз при выполнении OPTIMIZE
TABLE. Последующие операции 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.