Поиск

Тонкая настройка полнотекстового поиска MySQL

Средство полнотекстового поиска MySQL пока имеет только несколько настраивае­мых пользователем параметров, несмотря на то, что задача добавления новых обладает высоким приоритетом в планах того, что должно быть нами сделано. Вы можете полу­чить больший контроль над поведением полнотекстового поиска, если у вас есть исход­ный дистрибутив MySQL, потому что некоторые изменения требуют модификации ис­ходного кода.

Отметим, что полнотекстовый поиск был тщательно настроен для обеспечения наи­лучшей эффективности. Модификация поведения по умолчанию может в большинстве случаев только ухудшить результат. Не изменяйте исходных текстов MySQL, если толь­ко вы точно не знаете, что делаете!
Большинство переменных, имеющих отношение к полнотекстовому поиску, и опи­санных ниже, могут быть установлены во время запуска сервера. Для того чтобы изме­нить эти переменные, требуется перезапуск сервера; динамическая модификация во время работы сервера не предусмотрена.
Некоторые изменения переменных требуют перестройки FULLTEXT-индексов ваших таблиц. Инструкции приведены в конце настоящего раздела.

  • Минимальная и максимальная длина слов, подлежащих индексации, определяется системными переменными ft_min_word__len и ft_max_word_ len (доступными, начиная с версии MySQL 4.0.0). Минимальное значение по умолчанию - четыре символа. Максимум по умолчанию зависит от вашей версии MySQL. Если вы изменяете любое из этих значений, то должны перестроить свои FULLTEXT-индексы. Например, если выхотите, чтобы можно было искать трехсимвольные слова, то можете изменить значение переменной ft_min_word_len, поместив следующие строки в файл опций:
[mysqld] ft_min_word_len=3
Затем перезапустите сервер и перестройте существующие FULLTEXT-индексы. Об­ратите особое внимание на примечания относительно myisamchk в инструкциях, следующих за настоящим списком.

  1. Чтобы переопределить список стоп-слов по умолчанию, установите системную переменную ft_stopword_file (применяется, начиная с MySQL 4.0.10). Значением переменной должен быть полный путь к файлу, содержащему список стоп слов, либо пустая строка, если надо отключить фильтрацию по стоп-словам. После изменения этой переменной перестройте существующие FULLTEXT-индексы.
  2. 50%-ный порог для естественного языкового поиска определяется выбором определенной схемы "весовых соотношений". Чтобы отключить ее, найдите в файле myisam/ftdefs.h следующую строку:

#define GWS_IN_USE GWS_PROB Измените ее следующим образом:
tdefine GWS_IN_USE GWS_FREQ
Затем перекомпилируйте MySQL. В этом случае перестраивать индексы не потре­буется.
% На заметку!
ЩСделав это, вы значительно снизите способность MySQL присваивать строкам адекватные реле-Ж вантные значения функцией MATCH (). Если вам действительно нужно выполнять поиск по таким
часто употребляемым словам, будет лучше вместо этого применить поиск с IN BOOLEAN MODE,
который не обращает внимания на 50%-ный порог.

  • Чтобы изменить операции, применяемые для булевского полнотекстового поиска,установите системную переменную ft_boolean_syntax (доступна, начиная с MySQL 4.0.1). Эта переменная также может быть изменена на работающем сервере, но вы должны иметь привилегию SUPER для того, чтобы сделать это. Перестраивать индексы не нужно.

Если вы модифицируете полнотекстовые переменные, которые затрагивают индекса­цию (ft_min_word_len, ft_max_word__len или ft_stopword_file), то после внесения из­менений должны перестроить все свои FULLTEXT-индексы и перезапустить сервер. Чтобы перестроить индексы в этом случае, достаточно выполнить операцию быстрого восста­новления таблицы:
mysql> REPAIR TABLE имя_таблицыQUICK;
Специально в связи с использованием средства IN BOOLEAN MODE, если вы обновляете сервер MySQL 3.23 до версии 4.0 или выше, также необходимо заменить заголовок ин­декса. Чтобы сделать это, выполните следующее:
mysql> REPAIR TABLE имя_таблицыUSE_FRM;
Это необходимо потому, что булевский полнотекстовый поиск требует наличия флага в заголовке индекса, которого не было в MySQL 3.23, и который не добавляется, если вы осуществляете только восстановление QUICK. При попытке выполнить булевский полно­текстовый поиск без такой перестройки индексов, он вернет некорректный результат.
Отметим, что если вы используете myisamchk для операции, которая модифицирует индексы (такой как анализ или восстановление), FULLTEXT-индексы перестраиваются с использованием значений по умолчанию для параметров минимальной и максимальной длины слова, а также файла стоп-слов на сервере, если вы не укажете другого. Это мо­жет приводить к аварийному завершению запросов.
Проблема возникает из-за того, что эти параметры известны только серверу. Они не сохраняются в индексных файлах MyISAM. Чтобы избежать проблем, когда вы модифи­цируете длину минимального и максимального слова или файл стоп-слов на сервере, нужно указывать те же значения ft_min_word_len, ft_max_word_len и ft_stopword_file программе myisamchk, что используются в mysqld. Например, если минимальная длина слова установлена в 3 символа, вы можете восстановить таблицу с помощью myisamchk следующим образом:
shell> myisamchk -recover —ft_min_word_len=3 имя_таблицы.Ш1
Чтобы гарантировать, что myisamchk и сервер используют те же значения параметров полнотекстового поиска, можно поместить каждый из них в оба раздела [mysqld] и [mysqlchk] файла опций.
[mysqld]
f t_min_word_len=3
[myisamchk]
f t_m in_word_len=3
Альтернативой применению myisamchk являются операторы REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE или ALTER TABLE. Эти операторы выполняются сервером, которо­му известны правильные значения параметров полнотекстового поиска.