MySQL Полнотекстовый поиск
Полнотекстовый поиск
Полнотекстовый поиск на сервере MySQL позволяет пользователям выполнять полнотекстовые запросы к символьным данным в таблицах MySQL. Вы должны создать полнотекстовый индекс для таблицы, прежде чем выполнять полнотекстовые запросы к таблице. Полнотекстовый индекс может включать в себя один или несколько символьных столбцов в таблице.
- FULLTEXT - тип индекса полнотекстового индекса в MySQL.
- Таблицы InnoDB или MyISAM используют полнотекстовые индексы.
- Полнотекстовые индексы могут быть созданы только для столбцов VARCHAR, CHAR или TEXT.
- Определение индекса FULLTEXT может быть задано в операторе CREATE TABLE или может быть добавлено позже с помощью ALTER TABLE или CREATE INDEX.
- Большие наборы данных без индекса FULLTEXT намного быстрее загружают данные в таблицу, чем загружают данные в таблицу с существующим индексом FULLTEXT. Поэтому создайте индекс после загрузки данных.
Версия MySQL: 5.6
Синтаксис:
MATCH (col1, col2, col3 ...) ПРОТИВ (expr [search_modifier])
- col1, col2, col3 - разделенный запятыми список, в котором указаны столбцы для поиска
- AGAINST () принимает строку для поиска и необязательный модификатор, который указывает, какой тип поиска выполнять.
- Строка поиска должна быть строковым значением. Значение является постоянным во время оценки запроса.
Существует три типа полнотекстового поиска:
- Естественный язык полнотекстового поиска
- Булевы полнотекстовые поиски
- Поиск расширения запроса
Примечание. Некоторые слова игнорируются при полнотекстовом поиске.
- Минимальная длина слова для полнотекстового поиска:
- Три символа для поисковых индексов InnoDB.
- Четыре символа для поисковых индексов MyISAM.
- Стоп-слова - это слова, которые очень распространены, такие как «on», «the» или «it», которые встречаются почти в каждом документе. Эти слова игнорируются при поиске.
Естественный язык полнотекстового поиска
Полнотекстовый поиск на естественном языке интерпретирует строку поиска как свободный текст (естественный человеческий язык), и никаких специальных операторов не требуется. Полнотекстовый поиск - это поиск на естественном языке, если указан модификатор IN NATURAL LANGUAGE MODE (см. Следующий синтаксис) или нет. Функция MATCH () ищет строку в текстовой коллекции (набор из одного или нескольких столбцов, включенных в индекс FULLTEXT.). Для каждой строки в таблице MATCH () возвращает значение релевантности; то есть мера сходства между строкой поиска (заданной в качестве аргумента функции AGAINST ()) и текстом в этой строке в столбцах, названных в списке MATCH ().
Базовый формат запроса режима нулевого текстового поиска на естественном языке выглядит следующим образом:
Код:
SELECT * FROM table_name WHERE MATCH(col1, col2)
AGAINST('search terms' IN NATURAL LANGUAGE MODE)
пример
mysql> учебник CREATE TABLE ( id INT UNSIGNED AUTO_INCREMENT NOT NULL ПЕРВИЧНЫЙ КЛЮЧ, название VARCHAR (200), описание ТЕКСТ, FULLTEXT (название, описание) ) ДВИГАТЕЛЬ = InnoDB; Запрос в порядке, затронуто 0 строк (2,40 с)
Давайте вставим несколько записей в учебную таблицу:
mysql> INSERT INTO tutorial (название, описание) ЗНАЧЕНИЯ ('SQL Joins', 'Предложение SQL JOIN объединяет строки из двух или более таблиц. Создает набор строк во временной таблице.'), ('SQL Equi Join', 'SQL EQUI JOIN выполняет JOIN против значений равенства или сопоставления значений столбцов связанных таблиц. Знак равенства (=) используется в качестве оператора сравнения в предложении where для ссылки на равенство.'), («SQL Left Join», «SQL LEFT JOIN» объединяет две таблицы и выбирает строки на основе условия, которое совпадает в обеих таблицах, и несопоставленные строки также будут доступны из таблицы перед предложением JOIN. »), ('SQL Cross Join', 'SQL CROSS JOIN создает набор результатов, который представляет собой число строк в первой таблице, умноженное на количество строк во второй таблице, если предложение WHERE не используется вместе с CROSS JOIN.') , («SQL Full Outer Join», «В SQL FULL OUTER JOIN объединяет результаты как левого, так и правого внешних объединений и возвращает все (совпадающие или не совпадающие) строки из таблиц с обеих сторон предложения объединения».), («Самостоятельное объединение SQL», «Самостоятельное объединение - это объединение, в котором таблица объединяется с самим собой (что также называется унарными отношениями), особенно когда таблица имеет FOREIGN KEY, который ссылается на свой собственный PRIMARY KEY.»)
Позвольте искать строку 'left right' в поле описания:
mysql> SELECT * FROM из руководства, ГДЕ СООТВЕТСТВУЕТ (название, описание) ПРОТИВ («слева направо» В РЕЖИМЕ ЕСТЕСТВЕННОГО ЯЗЫКА); + ---- + --------------------- + ---------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------- + | id | название | описание | + ---- + --------------------- + ---------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------- + | 5 | SQL полное внешнее соединение | В SQL FULL OUTER JOIN объединяет результаты как левого, так и правого внешних объединений и возвращает все (совпадающие или не совпадающие) строки из таблиц с обеих сторон предложения join. | | 3 | SQL Left Join | SQL LEFT JOIN объединяет две таблицы и выбирает строки на основе условия, которые совпадают в обеих таблицах, и несопоставленные строки также будут доступны из таблицы перед предложением JOIN. | + ---- + --------------------- + ---------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------- + 2 ряда в наборе (0,00 сек)
По умолчанию поиск не учитывает регистр. Чтобы выполнить полнотекстовый поиск с учетом регистра, используйте двоичное сопоставление для индексированных столбцов. Например, столбцу, в котором используется набор символов latin1, можно назначить сопоставление latin1_bin, чтобы сделать его чувствительным к регистру при полнотекстовом поиске.
Когда MATCH () используется в предложении WHERE, как в примере, показанном ранее, возвращаемые строки автоматически сортируются с самой высокой релевантностью.
- Значения релевантности являются неотрицательными числами с плавающей точкой.
- Нулевая релевантность означает отсутствие сходства.
- Релевантность рассчитывается на основе -
- количество слов в строке
- количество уникальных слов в этом ряду
- общее количество слов в сборнике
- количество документов (строк), содержащих определенное слово.
В следующем примере показано, как явно получить значения релевантности:
<mysql> SELECT id, MATCH (название, описание) ПРОТИВ ('слева направо' В РЕЖИМЕ ЕСТЕСТВЕННОГО ЯЗЫКА) КАК оценка за учебник; + ---- + --------------------- + | id | оценка | + ---- + --------------------- + | 1 | 0 | | 2 | 0 | | 3 | 0.45528939366340637 | | 4 | 0 | | 5 | 0,8331640362739563 | | 6 | 0 | + ---- + --------------------- + 6 рядов в наборе (0,00 сек)
Подсчет совпадений
Для подсчета совпадений вы можете использовать запрос, подобный следующему:
mysql> SELECT COUNT (*) ИЗ руководства, ГДЕ СООТВЕТСТВУЮЩЕГО (название, описание) ПРОТИВ ('слева направо' В РЕЖИМЕ ЕСТЕСТВЕННОГО ЯЗЫКА); + ---------- + | СЧЕТ (*) | + ---------- + | 2 | + ---------- + 1 ряд в наборе (0,03 сек)
Булевы полнотекстовые поиски
Логический поиск интерпретирует строку поиска, используя правила специального языка запросов. Строка содержит слова для поиска. Он также может содержать операторы, которые определяют требования так, что слово должно присутствовать или отсутствовать в совпадающих строках или быть взвешенным выше или ниже, чем обычно. Некоторые общие слова (стоп-слова) исключаются из индекса поиска и не совпадают, если присутствуют в строке поиска. MySQL может выполнять логический полнотекстовый поиск с использованием модификатора IN BOOLEAN MODE. С этим модификатором определенные символы имеют особое значение в начале или конце слов в строке поиска.
Основной формат запроса в логическом режиме выглядит следующим образом:
Код:
SELECT * FROM table_name WHERE MATCH(col1, col2)
AGAINST('search terms' IN BOOLEAN MODE)
Характеристики булевых полнотекстовых поисков:
- Не используйте порог 50%, который применяется к поисковым индексам MyISAM.
- Не сортируйте строки автоматически в порядке убывания релевантности.
- Булевы запросы к поисковому индексу MyISAM могут работать даже без индекса FULLTEXT.
- Применяются полнотекстовые параметры минимальной и максимальной длины слова:
- Для поисковых индексов InnoDB, innodb_ft_min_token_size и innodb_ft_max_token_size
- для поисковых индексов MyISAM: ft_min_word_len и ft_max_word_len.
- Полнотекстовый поиск InnoDB не поддерживает использование нескольких операторов в одном поисковом слове.
Логический полнотекстовый поиск поддерживает следующие операторы:
оператор | Описание | пример |
---|---|---|
+ | Ведущий знак плюс указывает, что слово должно присутствовать в каждой возвращаемой строке. | '+ присоединиться + союз' |
- | Ведущий знак минус указывает, что определенное слово не должно присутствовать ни в одной из возвращаемых строк. Оператор - действует только для исключения строк, которые в других случаях соответствуют другим условиям поиска. | '+ join -union' Найдите строки, которые содержат слово «join», но не «union». |
(без оператора) | По умолчанию слово является необязательным, но строки, содержащие его, имеют более высокий рейтинг. | 'присоединиться к союзу' Поиск строк, которые содержат хотя бы одно из двух слов. |
> < | Эти два оператора используются для изменения вклада слова в значение релевантности, назначенное строке. Оператор> увеличивает вклад, а оператор <уменьшает его. | '+ join + (> left <right)' Найдите строки, содержащие слова «join» и «left» или «join» и «right» (в любом порядке), но звание «join left» выше, чем «join right». |
() | Скобки группируют слова в подвыражения. Группы в скобках могут быть вложенными. | |
~ | Ведущая тильда действует как оператор отрицания, в результате чего вклад слова в релевантность строки будет отрицательным. | '+ присоединиться ~ слева' Найдите строки, содержащие слово «join», но если в строке также есть слово «left», оцените его ниже, чем если в строке нет. |
* | Звездочка служит оператором усечения (или подстановочного знака). В отличие от других операторов, он добавляется к слову, которое будет затронуто. Слова совпадают, если они начинаются со слова, предшествующего оператору *. | 'присоединиться*' Найти строки, содержащие такие слова, как «соединение», «соединение», «соединение» и т. Д. |
" | Фраза, заключенная в символы двойной кавычки («» »), соответствует только строкам, которые буквально содержат фразу, как она была набрана. | "левое соединение" Найдите строки, которые содержат точную фразу "let join". |
Пример: булевы полнотекстовые поиски
В следующем запросе запрос извлекает все строки, которые содержат слово «Joins», но не «right».
mysql> SELECT * FROM из учебника ГДЕ МАТЧ (название, описание) ПРОТИВ ('+ Joins -right' В БУЛЕВОМ РЕЖИМЕ); + ---- + --------------- + ---------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------- + | id | название | описание | + ---- + --------------- + ---------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------- + | 1 | SQL присоединяется | Предложение SQL JOIN объединяет строки из двух или более таблиц. Создает набор строк во временной таблице. | | 3 | SQL Left Join | SQL LEFT JOIN объединяет две таблицы и выбирает строки на основе условия, которое совпадает в обеих таблицах, и несопоставленные строки также будут доступны из таблицы перед предложением JOIN. | + ---- + --------------- + ---------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------- + 2 ряда в наборе (0,02 сек)
Предыдущая: ЛЕВЫЙ сдвиг и ПРАВОЙ сдвиг
Далее: MySQL Cast функции и операторы
Новый контент: Composer: менеджер зависимостей для PHP , R программирования