Spec-Zone.ru › MySQL 8.4

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 ngram-парсер для полнотекстового поиска
  • 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, «ngram-парсер для полнотекстового поиска» и разделе 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-8.4-en/fulltext-search.html

Spec-Zone.ru

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