Полный текстовый поиск

Этот документ представляет основы полного текстового поиска, объясняет, как он работает в базах данных YMatrix, и предоставляет примеры.

Предпосылки

Хотя операторы текстового поиска существуют в базах данных уже много лет — например, PostgreSQL предоставляет операторы LIKE, ILIKE, ~ и ~~* для текстовых типов данных — они не обладают многими ключевыми функциями, необходимыми современным информационным системам:

  • Ограниченная поддержка языков (даже для английского). Один только регулярные выражения (с подстановками для цифр, букв, символов и т.д., например, .*) недостаточны, поскольку они не могут легко обрабатывать варианты слов, такие как run и running. Если вы ищете run с помощью регулярных выражений, вы, скорее всего, пропустите документы, содержащие running.
  • Отсутствие ранжирования результатов. Это делает их неэффективными, когда запросу соответствуют тысячи документов.
  • Низкая производительность из-за отсутствия индексации. Для каждого поиска необходимо сканировать все документы, что замедляет работу.

Для решения этих проблем был разработан полный текстовый поиск.

Концепции

  • Полный текстовый поиск и полнотекстовый индекс: Полный текстовый поиск (или текстовый поиск) позволяет находить естественно-языковые документы, соответствующие условию запроса, и ранжировать результаты по релевантности. Он также является эффективным методом работы с неструктурированными данными — данными переменной длины или без фиксированного формата, такими как электронные письма или документы Word. Основная идея заключается в преобразовании неструктурированных данных в структурированную форму путем извлечения и переупорядочивания частей данных. Эта переформатированная информация называется полнотекстовым индексом, который затем используется для ускорения поиска.
  • Документ: Документ — это единица данных, которая ищется в системе полного текстового поиска. Например, статья в журнале или электронное письмо. Текстовый поисковый движок должен анализировать документ и хранить связи между лексемами и их родительскими документами. Эти связи используются для определения документов, содержащих термины запроса.

Возможности

Полный текстовый поиск предлагает следующие преимущества:

  • Более высокая точность: Полный текстовый поиск предоставляет более точные результаты, чем традиционные алгоритмы поиска, поскольку проверяет каждое слово в каждом сохраненном документе на соответствие критериям поиска.
  • Улучшенная эффективность поиска: Он повышает производительность, разделяя процесс на две фазы: индексирование и поиск. Во время индексирования все тексты документов сканируются для создания списка поисковых терминов.
  • Улучшенный пользовательский опыт: Возвращая более релевантные результаты, полный текстовый поиск улучшает пользовательский опыт и выявляет более значимую информацию по сравнению с простым поиском по подстрокам.
  • Универсальность: Полный текстовый поиск широко применяется в различных областях, включая веб-сайты, системы управления контентом и системы управления документами.

Принципы

Полный текстовый поиск требует создания полнотекстового индекса, который позволяет документам предварительно обрабатываться и храниться в оптимизированном формате для быстрого поиска. Предварительная обработка включает:

  1. Разбор документов на токены. Идентификация различных типов токенов — таких как числа, слова, составные слова или адреса электронной почты — позволяет обрабатывать их по-разному.
  2. Преобразование токенов в лексемы (или ключевые слова). Лексема — это нормализованная строка. Нормализация включает преобразование заглавных букв в строчные и удаление суффиксов слов (например, ing или ed). Это позволяет находить варианты слов. Коротко говоря, токены — это сырые фрагменты текста, а лексемы — это нормализованные формы, используемые для индексирования и поиска.
  3. Хранение предварительно обработанных документов для оптимизированного поиска. Каждый предварительно обработанный документ содержит упорядоченный массив нормализованных лексем вместе с информацией о позициях для ранжирования. Документы, в которых термины запроса встречаются ближе друг к другу, получают более высокие оценки релевантности и занимают более высокие позиции в результатах.

Помимо индексации, полный текстовый поиск опирается на два типа данных: tsvector и tsquery:

  • tsvector хранит предварительно обработанные документы.
  • tsquery представляет обработанные запросы.

Различные функции и операторы поддерживают эти типы данных. Наиболее важным является оператор соответствия @@.

Примеры

Примечание!
Таблицы MARS3 и MARS2 не поддерживают полный текстовый поиск.

Сначала создайте HEAP-таблицу с именем articles, содержащую столбцы id, title и content.

=# CREATE TABLE articles (
id int,
title text,
content text
)
DISTRIBUTED BY (id);

Вставьте 10 тестовых записей.

=# INSERT INTO articles (id, title, content) VALUES  
(1, 'Database Administration', 'Database administration is the process of organizing, storing, maintaining, and retrieving information from computer databases.'),  
(2, 'Data Analysis', 'Data analysis is the process of using statistical and computational tools to extract useful information from raw data.'),  
(3, 'Machine Learning', 'Machine learning is a form of artificial intelligence (AI) that enables computers to learn without being explicitly programmed.'),  
(4, 'Deep Learning', 'Deep learning is a method of machine learning that relies on artificial neural networks to model decision-making.'),  
(5, 'Natural Language Processing', 'Natural Language Processing (NLP) is a technology that enables computers to understand, interpret, and generate human language.'),  
(6, 'Computer Vision', 'Computer vision is a field of study that enables computers to gain high-level understanding from images or multidimensional data.'),  
(7, 'Software Engineering', 'Software engineering is an applied science that uses systematic methods to design, develop, and test software.'),  
(8, 'Cybersecurity', 'Cybersecurity involves protecting computer systems and their data from unauthorized access or damage.'),  
(9, 'Cloud Computing', 'Cloud computing is a model for delivering on-demand computing resources and data over the internet.'),  
(10, 'Internet of Things', 'The Internet of Things (IoT) is a system that connects physical devices over a network to exchange data.');

Пример нечеткого поиска (не полный текстовый поиск)

=# SELECT id, title, content
FROM articles
WHERE content like '%Learning%';
 id |  title           |                                content
----+------------------+------------------------------------------------------------------------
3   | Machine Learning | Machine learning is a form of artificial intelligence (AI) that enables computers to learn without being explicitly programmed.  
4   | Deep Learning    | Deep learning is a machine learning approach that relies on artificial neural networks to model decision-making.
(2 rows)

Пример полного текстового поиска

Для полного текстового поиска требуются две функции:

  • to_tsquery: Преобразует текст в tsquery — обработанный запрос. Слова должны быть объединены с использованием допустимых операторов tsquery.
  • to_tsvector: Преобразует текст в tsvector — предварительно обработанный документ, содержащий информацию о позициях каждого слова.

Создайте полнотекстовый индекс.

=# CREATE INDEX articles_content_gin ON articles USING gin(to_tsvector('simple', content));

Используйте этот индекс для полного текстового поиска. Оператор @@ определяет, соответствуют ли два элемента друг другу. Порядок не имеет значения. Он возвращает TRUE, если совпадение найдено, и FALSE в противном случае.

=# SELECT id, title, content
FROM articles
WHERE to_tsvector('simple', content) @@ to_tsquery('simple', 'Deep learning is a machine learning approach');
 id |   title          |                                content
----+------------------+------------------------------------------------------------------------
4   | Deep Learning    | Deep learning is a machine learning approach that relies on artificial neural networks to model decision-making.
(1 row)

Этот запрос полного текстового поиска выполняет следующее:

  1. Часть SELECT id, title, content FROM articles — это стандартный SQL, извлекающий поля id, title и content из таблицы articles.
  2. Клауза WHERE to_tsvector(...) @@ to_tsquery(...) применяет полный текстовый поиск для поиска документов в поле content, соответствующих запросу. Обратите внимание: поскольку в этом примере используется китайский текст, применяется конфигурация simple, которая не выполняет языковую специфическую обработку. Для английского контента используйте english.
  3. Функция to_tsvector('simple', content) преобразует поле content в tsvector (вектор лексем) для полного текстового поиска.
  4. Функция to_tsquery('simple', 'Deep learning is a machine learning approach') преобразует строку запроса в tsquery (вектор поиска).
  5. Оператор @@ сопоставляет tsvector и tsquery. Он возвращает TRUE, если поле content содержит термины запроса, и FALSE в противном случае.

Вы можете просмотреть план запроса, чтобы убедиться, что запрос использует полнотекстовый индекс.

=# EXPLAIN SELECT id, title, content
FROM articles
WHERE to_tsvector('simple', content) @@ to_tsquery('simple', 'machine');
                                          QUERY PLAN
----------------------------------------------------------------------------------------------
 Gather Motion 4:1  (slice1; segments: 4)  (cost=13.26..52.13 rows=167 width=68)
   ->  Bitmap Heap Scan on articles  (cost=13.26..50.04 rows=42 width=68)
         Recheck Cond: (to_tsvector('simple'::regconfig, content) @@ '''machine'''::tsquery)
         ->  Bitmap Index Scan on articles_content_gin  (cost=0.00..13.25 rows=42 width=0)
               Index Cond: (to_tsvector('simple'::regconfig, content) @@ '''machine'''::tsquery)
 Optimizer: Postgres query optimizer
(6 rows)

План запроса показывает Bitmap Index Scan on articles_content_gin, подтверждающий, что используется индекс articles_content_gin.

В заключение, этот запрос выполняет полный текстовый поиск по таблице articles с использованием полнотекстового индекса. Он выбирает все строки, в которых поле content содержит термин machine, и возвращает поля id, title и content совпадающих строк.