Spec-Zone.ru › MySQL 9.2

14.9 Функции полнотекстового поиска

  • 14.9.1 Полнотекстовый поиск с использованием естественного языка
  • 14.9.2 Полнотекстовый поиск по булевым выражениям
  • 14.9.3 Полнотекстовый поиск с расширением запроса
  • 14.9.4 Стоп-слова полнотекстового поиска
  • 14.9.5 Ограничения полнотекстового поиска
  • 14.9.6 Настройка полнотекстового поиска MySQL
  • 14.9.7 Добавление пользовательской сортировки для полнотекстового индексирования
  • 14.9.8 Нграмный полнотекстовый анализатор
  • 14.9.9 Плагин полнотекстового анализатора MeCab

MATCH (col1,col2,...) AGAINST (expr [search_modifier])

search_modifier:
  {
       IN NATURAL LANGUAGE MODE
     | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
     | IN BOOLEAN MODE
     | WITH QUERY EXPANSION
  }

MySQL поддерживает полнотекстовое индексирование и поиск:

  • Полнотекстовый индекс в MySQL — это индекс типа FULLTEXT.

  • Полнотекстовые индексы могут использоваться только с таблицами InnoDB или MyISAM и могут создаваться только для столбцов типа CHAR, VARCHAR или TEXT.

  • MySQL предоставляет встроенный полнотекстовый анализатор ngram, поддерживающий китайский, японский и корейский (CJK), и устанавливаемый плагин полнотекстового анализатора MeCab для японского языка. Различия в обработке описаны в разделе 14.9.8, «Нграмный полнотекстовый анализатор» и разделе 14.9.9, «Плагин полнотекстового анализатора MeCab».

  • Определение индекса FULLTEXT может быть задано в операторе CREATE TABLE при создании таблицы или добавлено позже с помощью ALTER TABLE или CREATE INDEX.

  • Для больших наборов данных намного быстрее загрузить данные в таблицу без индекса FULLTEXT, а затем создать индекс, чем загружать данные в таблицу с существующим индексом FULLTEXT.

Полнотекстовый поиск выполняется с помощью синтаксиса MATCH() AGAINST(). MATCH() принимает список столбцов, разделенных запятыми, которые нужно искать. AGAINST принимает строку для поиска и необязательный модификатор, указывающий тип поиска. Строка поиска должна быть строковым значением, постоянным во время оценки запроса. Это исключает, например, столбец таблицы, так как он может отличаться для каждой строки.

MySQL не допускает использование группирующего столбца с MATCH(); то есть любой запрос, соответствующий всем перечисленным критериям, отклоняется с ошибкой:

  • MATCH() появляется в списке SELECT, в GROUP BY, HAVING или ORDER BY блоке запроса.

  • Блок запроса содержит GROUP BY ... WITH ROLLUP предложение.

  • Аргумент вызова функции MATCH() является одним из столбцов группировки.

Некоторые примеры таких запросов показаны здесь:

# MATCH() in SELECT list...
SELECT MATCH (a) AGAINST ('abc') FROM t GROUP BY a WITH ROLLUP;
SELECT 1 FROM t GROUP BY a, MATCH (a) AGAINST ('abc') WITH ROLLUP;

# ...in HAVING clause...
SELECT 1 FROM t GROUP BY a WITH ROLLUP HAVING MATCH (a) AGAINST ('abc');

# ...and in ORDER BY clause
SELECT 1 FROM t GROUP BY a WITH ROLLUP ORDER BY MATCH (a) AGAINST ('abc');

Использование MATCH() с группирующим столбцом в предложении WHERE разрешено.

Существует три типа полнотекстовых поисков:

  • Поиск по естественному языку интерпретирует строку поиска как фразу на естественном языке (фразу в свободном тексте). Нет специальных операторов, за исключением символов двойных кавычек ("). Применяется список стоп-слов. Дополнительную информацию о списках стоп-слов см. в разделе 14.9.4, «Стоп-слова полнотекстового поиска».

    Полнотекстовый поиск является поиском по естественному языку, если указан модификатор IN NATURAL LANGUAGE MODE или если модификатор не указан. Дополнительную информацию см. в разделе 14.9.1, «Полнотекстовый поиск с использованием естественного языка».

  • Поиск по булевым выражениям интерпретирует строку поиска по правилам специального языка запросов. Строка содержит слова для поиска. Она также может содержать операторы, которые задают требования, такие как обязательное или необязательное наличие слова в совпадающих строках или его приоритет. Некоторые общие слова (стоп-слова) исключаются из индекса поиска и не соответствуют, если присутствуют в строке поиска. Модификатор IN BOOLEAN MODE указывает булев поиск. Дополнительную информацию см. в разделе 14.9.2, «Полнотекстовый поиск по булевым выражениям».

  • Поиск с расширением запроса — это модификация поиска по естественному языку. Строка поиска используется для выполнения поиска по естественному языку. Затем слова из наиболее релевантных строк, возвращенных результатами поиска, добавляются в строку поиска, и поиск выполняется снова. Запрос возвращает строки из второго поиска. Модификатор IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION или WITH QUERY EXPANSION указывает поиск с расширением запроса. Дополнительную информацию см. в разделе 14.9.3, «Полнотекстовый поиск с расширением запроса».

Сведения о производительности запросов FULLTEXT см. в разделе 10.3.5, «Индексы столбцов».

Дополнительную информацию об индексах InnoDB FULLTEXT см. в разделе 17.6.2.4, «Индексы полнотекстового поиска InnoDB».

Ограничения полнотекстового поиска перечислены в разделе 14.9.5, «Ограничения полнотекстового поиска».

Утилита myisam_ftdump выводит содержимое полнотекстового индекса MyISAM. Это может быть полезно для отладки полнотекстовых запросов. См. раздел 6.6.3, «myisam_ftdump — Отображение информации о полнотекстовом индексе».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/fulltext-search.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API