Этот документ представляет основы полного текстового поиска, объясняет, как он работает в базах данных YMatrix, и предоставляет примеры.
Хотя операторы текстового поиска существуют в базах данных уже много лет — например, PostgreSQL предоставляет операторы LIKE, ILIKE, ~ и ~~* для текстовых типов данных — они не обладают многими ключевыми функциями, необходимыми современным информационным системам:
.*) недостаточны, поскольку они не могут легко обрабатывать варианты слов, такие как run и running. Если вы ищете run с помощью регулярных выражений, вы, скорее всего, пропустите документы, содержащие running.Для решения этих проблем был разработан полный текстовый поиск.
Полный текстовый поиск предлагает следующие преимущества:
Полный текстовый поиск требует создания полнотекстового индекса, который позволяет документам предварительно обрабатываться и храниться в оптимизированном формате для быстрого поиска. Предварительная обработка включает:
ing или ed). Это позволяет находить варианты слов. Коротко говоря, токены — это сырые фрагменты текста, а лексемы — это нормализованные формы, используемые для индексирования и поиска.Помимо индексации, полный текстовый поиск опирается на два типа данных: 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)
Этот запрос полного текстового поиска выполняет следующее:
SELECT id, title, content FROM articles — это стандартный SQL, извлекающий поля id, title и content из таблицы articles.WHERE to_tsvector(...) @@ to_tsquery(...) применяет полный текстовый поиск для поиска документов в поле content, соответствующих запросу. Обратите внимание: поскольку в этом примере используется китайский текст, применяется конфигурация simple, которая не выполняет языковую специфическую обработку. Для английского контента используйте english.to_tsvector('simple', content) преобразует поле content в tsvector (вектор лексем) для полного текстового поиска.to_tsquery('simple', 'Deep learning is a machine learning approach') преобразует строку запроса в tsquery (вектор поиска).@@ сопоставляет 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 совпадающих строк.