У нас есть сайт, который использует полнотекстовый поиск MySQL, но имеет проблему, заключающуюся в том, что количество строк, которые необходимо проиндексировать, составляет 3 символа. Я знаю, что MySQL по умолчанию не индексирует строки такой длины, но я также знаю, что это можно изменить в my.cnf. Я предполагаю, что причина ограничения в первую очередь зависит от производительности, поэтому я не уверен, стоит ли это изменить? Какие у нас здесь есть варианты? На этом сервере есть несколько сайтов, поэтому любое снижение производительности может вызвать проблемы для ряда сайтов.
версия mysql: 5
Причина в производительности, да. Снижение предела по умолчанию увеличит пространство, необходимое для хранения индексов, а увеличение размера индекса займет больше времени для поиска. Воздействие будет зависеть от использования (типа выполняемых запросов) и размера текущего набора данных. Минимальное значение по умолчанию - 4, вы можете уменьшить его так:
[mysqld]
ft_min_word_len=3
Когда вы перестраиваете свои индексы (как это необходимо), убедитесь, что не восстанавливаете, а отбрасываете и перестраиваете индексы. Это значительно быстрее, чем их ремонтировать.
mysql> ALTER TABLE tbl_name DROP INDEX ft_index;
Query OK, 9999 rows affected (0.00 sec)
Records: 9999 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE tbl_name CREATE INDEX ft_index( searchable_text );
Query OK, 9999 rows affected (0.00 sec)
Records: 9999 Duplicates: 0 Warnings: 0
Вероятно, ваше лучшее решение - отслеживать размер индексов на сервере разработки до и после изменения длины индекса.
Наилучший вариант (на который я отложил) - игнорировать полнотекстовое сопоставление MySQL (которое имеет серьезные ограничения, включая только MyISAM, невозможность сопоставления с подстановочными знаками с префиксом, запрещающий список стоп-слов по умолчанию) и реализовать стороннее решение. Доступны следующие лучшие варианты:
Я бы лично выбрал Lucene, хотя для этого требуется локальный экземпляр java. Если это невозможно, Sphinx очень легко настроить для PHP (прохождение здесь) и многие другие языки.
Здесь несколько хороших тестов и чьи-то первые впечатления по вопросу.
В качестве альтернативы ответу Энди вместо изменения глобальной настройки вы можете добавить фиктивный символ в конец короткого слова, чтобы искусственно увеличить его длину.
Например, для слова «at» вы можете заменить его на «at--» (которое имеет длину 4), а для слова «see» вы можете заменить его на «see-» (которое также имеет длину 4).
Вы можете получить такой столбец и проиндексировать его, но вернуть исходные данные.