14.9.7 Добавление пользовательской сортировки для полнотекстового индексирования
Пользовательские сортировки устарели; ожидается, что поддержка их будет удалена в будущей версии MySQL. Сервер выдает предупреждение при любом использовании COLLATE
в операторе SQL; предупреждение также выдается при запуске сервера с user_defined_collation--collation-server установленным равным имени пользовательской сортировки.
В этом разделе описывается, как добавить пользовательскую сортировку для полнотекстового поиска с использованием встроенного полнотекстового анализатора. Пример сортировки похож на latin1_swedish_ci, но обрабатывает символ '-' как букву, а не как знак пунктуации, чтобы он мог быть индексирован как символ слова. Общие сведения о добавлении сортировок приведены в разделе 12.14 «Добавление сортировки к набору символов»; предполагается, что вы его прочли и знакомы с участвующими файлами.
Для добавления сортировки для полнотекстового индексирования используйте следующую процедуру. Здесь добавляется сортировка для простого набора символов, который, как обсуждалось в разделе 12.14 «Добавление сортировки к набору символов», может быть создан с помощью файла конфигурации, описывающего свойства набора символов. Для сложного набора символов, такого как Unicode, создавайте сортировки с использованием файлов исходного кода C, описывающих свойства набора символов.
-
Добавьте сортировку в файл
Index.xml. Допустимый диапазон идентификаторов пользовательских сортировок приведен в разделе 12.14.2 «Выбор идентификатора сортировки». Идентификатор должен быть неиспользуемым, поэтому выберите значение, отличное от 1025, если этот идентификатор уже используется в вашей системе.<charset name="latin1"> ... <collation name="latin1_fulltext_ci" id="1025"/> </charset>
-
Объявите порядок сортировки для сортировки в файле
latin1.xml. В данном случае порядок можно скопировать изlatin1_swedish_ci:<collation name="latin1_fulltext_ci"> <map> 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF 41 41 41 41 5C 5B 5C 43 45 45 45 45 49 49 49 49 44 4E 4F 4F 4F 4F 5D D7 D8 55 55 55 59 59 DE DF 41 41 41 41 5C 5B 5C 43 45 45 45 45 49 49 49 49 44 4E 4F 4F 4F 4F 5D F7 D8 55 55 55 59 59 DE FF </map> </collation>
-
Измените массив
ctypeв файлеlatin1.xml. Измените значение, соответствующее 0x2D (что соответствует коду символа'-'), с 10 (знак пунктуации) на 01 (заглавная буква). В приведенном массиве это элемент в четвёртой строке, третий справа.<ctype> <map> 00 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 48 10 10 10 10 10 10 10 10 10 10 10 10
0110 10 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20 10 00 10 02 10 10 10 10 10 10 01 10 01 00 01 00 00 10 10 10 10 10 10 10 10 10 02 10 02 00 02 01 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 10 01 01 01 01 01 01 01 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 10 02 02 02 02 02 02 02 02 </map> </ctype> Перезапустите сервер.
-
Для использования новой сортировки включите её в определение столбцов, которые должны её использовать:
mysql>
DROP TABLE IF EXISTS t1;Query OK, 0 rows affected (0.13 sec) mysql>CREATE TABLE t1 (a TEXT CHARACTER SET latin1 COLLATE latin1_fulltext_ci,FULLTEXT INDEX(a)) ENGINE=InnoDB;Query OK, 0 rows affected (0.47 sec) -
Протестируйте сортировку, чтобы убедиться, что дефис рассматривается как символ слова:
mysql>
INSERT INTO t1 VALUEs ('----'),('....'),('abcd');Query OK, 3 rows affected (0.22 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>SELECT * FROM t1 WHERE MATCH a AGAINST ('----' IN BOOLEAN MODE);+------+ | a | +------+ | ---- | +------+ 1 row in set (0.00 sec)
© 2025 Oracle
Licensed under the GPLv2 License.