Spec-Zone.ru › MariaDB

Обзор индексации по полному тексту

MariaDB поддерживает индексацию и поиск по полному тексту:

  • Индекс по полному тексту в MariaDB — это индекс типа FULLTEXT, и он предоставляет больше возможностей при поиске фрагментов текста в поле.
  • Индексы по полному тексту могут использоваться только с таблицами MyISAM, Aria, InnoDB и Mroonga, и могут быть созданы только для столбцов типа CHAR, VARCHAR или TEXT.
  • Разделенные таблицы не могут содержать индексы по полному тексту, даже если движок хранилища их поддерживает.
  • Определение индекса FULLTEXT можно указать в операторе CREATE TABLE при создании таблицы, или добавить его позже с помощью ALTER TABLE или CREATE INDEX.
  • Для больших наборов данных намного быстрее загрузить данные в таблицу без индекса FULLTEXT, а затем создать индекс, чем загрузить данные в таблицу с уже существующим индексом FULLTEXT.

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

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

Исключенные результаты

  • Исключаются части слов.
  • Слова длиной менее 4 (MyISAM) или 3 (InnoDB) символов не будут храниться в индексе по полному тексту. Это значение можно настроить, изменив системную переменную ft_min_word_length (или, для InnoDB, innodb_ft_min_token_size).
  • Слова длиной более 84 символов также не будут храниться в индексе по полному тексту. Это значение можно настроить, изменив системную переменную ft_max_word_length (или, для InnoDB, innodb_ft_max_token_size).
  • Стоп-слова — это список общих слов, таких как «once» или «then», которые не отражаются в результатах поиска, если не используется режим BOOLEAN MODE. Список стоп-слов для таблиц MyISAM/Aria и InnoDB может отличаться. Подробности и полный список см. в stopwords, а также информацию о том, как изменить стандартный список.
  • Только для индексов MyISAM/Aria по полному тексту, если слово встречается более чем в половине строк, оно также исключается из результатов поиска по полному тексту.
  • Для индексов InnoDB отображаются только подтвержденные строки — изменения из текущей транзакции не применяются.

Релевантность

MariaDB рассчитывает релевантность каждого результата на основе нескольких факторов, включая количество слов в индексе, количество уникальных слов в строке, общее количество слов как в индексе, так и в результатах, а также вес слова. В английском языке слово «cool» будет иметь меньший вес, чем «dandy», по крайней мере, на данный момент! Релевантность может быть возвращена в рамках запроса, просто используя функцию MATCH в списке полей.

Типы поиска по полному тексту

В РЕЖИМЕ ЕСТЕСТВЕННОГО ЯЗЫКА

РЕЖИМ ЕСТЕСТВЕННОГО ЯЗЫКА — это тип поиска по полному тексту по умолчанию, и ключевые слова можно опустить. Нет специальных операторов, и поиски состоят из одного или нескольких ключевых слов, разделенных запятыми.

Результаты возвращаются в порядке убывания релевантности.

В РЕЖИМЕ БУЛЕВЫХ ОПЕРАТОРОВ

Поиск с использованием булевых операторов позволяет использовать ряд специальных операторов:

Оператор Описание
+ Слово обязательно во всех возвращаемых строках.
- Слово не должно встречаться ни в одной возвращаемой строке.
< Слово, за которым следует, имеет меньшую релевантность, чем другие слова, хотя строки, содержащие его, все равно будут соответствовать
> Слово, за которым следует, имеет большую релевантность, чем другие слова.
() Используется для группирования слов в подвыражения.
~ Слово, за которым следует, отрицательно влияет на релевантность строки (что отличается от оператора '-', который специально исключает слово, или оператора '<', который все равно заставляет слово положительно влиять на релевантность строки).
* Подстановочный символ, указывающий ноль или более символов. Он может появляться только в конце слова.
" Все, что заключено в двойные кавычки, рассматривается как целое (так что вы можете, например, искать фразы).

Результаты не возвращаются в порядке релевантности, и лимит в 50% не применяется. Стоп-слова и минимальная и максимальная длина слов по-прежнему применяются как обычно.

С РАСШИРЕНИЕМ ЗАПРОСА

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

Примеры

Создание таблицы и выполнение базового поиска:

CREATE TABLE ft_myisam(copy TEXT,FULLTEXT(copy)) ENGINE=MyISAM;

INSERT INTO ft_myisam(copy) VALUES ('Once upon a time'),
  ('There was a wicked witch'), ('Who ate everybody up');

SELECT * FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked');
+--------------------------+
| copy                     |
+--------------------------+
| There was a wicked witch |
+--------------------------+

Несколько слов:

SELECT * FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked,witch');
+---------------------------------+
| copy                            |
+---------------------------------+
| There was a wicked witch        |
+---------------------------------+

Поскольку «Once» — стоп-слово, результат не возвращается:

SELECT * FROM ft_myisam WHERE MATCH(copy) AGAINST('Once');
Empty set (0.00 sec)

Вставка слова «wicked» в более чем половину строк исключает его из результатов:

INSERT INTO ft_myisam(copy) VALUES ('Once upon a wicked time'),
  ('There was a wicked wicked witch'), ('Who ate everybody wicked up');

SELECT * FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked');
Empty set (0.00 sec)

Использование РЕЖИМА БУЛЕВЫХ ОПЕРАТОРОВ для преодоления ограничения в 50%:

SELECT * FROM ft_myisam WHERE MATCH(copy) AGAINST('wicked' IN BOOLEAN MODE);
+---------------------------------+
| copy                            |
+---------------------------------+
| There was a wicked witch        |
| Once upon a wicked time         |
| There was a wicked wicked witch |
| Who ate everybody wicked up     |
+---------------------------------+

Возвращение релевантности:

SELECT copy,MATCH(copy) AGAINST('witch') AS relevance 
  FROM ft_myisam WHERE MATCH(copy) AGAINST('witch');
+---------------------------------+--------------------+
| copy                            | relevance          |
+---------------------------------+--------------------+
| There was a wicked witch        | 0.6775632500648499 |
| There was a wicked wicked witch | 0.5031757950782776 |
+---------------------------------+--------------------+

С РАСШИРЕНИЕМ ЗАПРОСА. В следующем примере слово «MariaDB» всегда ассоциируется со словом «база данных», поэтому оно возвращается при использовании расширения запроса, даже если оно не запрашивается явно.

CREATE TABLE ft2(copy TEXT,FULLTEXT(copy)) ENGINE=MyISAM;

INSERT INTO ft2(copy) VALUES
 ('MySQL vs MariaDB database'),
 ('Oracle vs MariaDB database'), 
 ('PostgreSQL vs MariaDB database'),
 ('MariaDB overview'),
 ('Foreign keys'),
 ('Primary keys'),
 ('Indexes'),
 ('Transactions'),
 ('Triggers');

SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('database');
+--------------------------------+
| copy                           |
+--------------------------------+
| MySQL vs MariaDB database      |
| Oracle vs MariaDB database     |
| PostgreSQL vs MariaDB database |
+--------------------------------+
3 rows in set (0.00 sec)

SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('database' WITH QUERY EXPANSION);
+--------------------------------+
| copy                           |
+--------------------------------+
| MySQL vs MariaDB database      |
| Oracle vs MariaDB database     |
| PostgreSQL vs MariaDB database |
| MariaDB overview               |
+--------------------------------+
4 rows in set (0.00 sec)

Сопоставление частичных слов с использованием РЕЖИМА БУЛЕВЫХ ОПЕРАТОРОВ:

SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('Maria*' IN BOOLEAN MODE);
+--------------------------------+
| copy                           |
+--------------------------------+
| MySQL vs MariaDB database      |
| Oracle vs MariaDB database     |
| PostgreSQL vs MariaDB database |
| MariaDB overview               |
+--------------------------------+

Использование булевых операторов

SELECT * FROM ft2 WHERE MATCH(copy) AGAINST('+MariaDB -database' 
  IN BOOLEAN MODE);
+------------------+
| copy             |
+------------------+
| MariaDB overview |
+------------------+

См. также

  • Для более простых поисков подстроки в текстовых столбцах см. оператор LIKE.
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется заранее компанией MariaDB. Мнения, информация и мнения, выраженные в данном содержании, не обязательно отражают мнения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/full-text-index-overview/

Spec-Zone.ru

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