Расширение полнотекстового поиска
Расширение полнотекстового поиска — это расширение DuckDB, которое позволяет выполнять поиск по строкам, подобно расширению FTS5 в SQLite.
Установка и загрузка
Расширение fts будет автоматически загружено при первом использовании из официального репозитория расширений. Если вы хотите установить и загрузить его вручную, выполните следующую команду:
INSTALL fts; LOAD fts;
Использование
Расширение добавляет две PRAGMA команды в DuckDB: одну для создания и одну для удаления индекса. Кроме того, добавлена скалярная макрос stem, который используется расширением внутри.
PRAGMA create_fts_index
create_fts_index(input_table, input_id, *input_values, stemmer = 'porter',
stopwords = 'english', ignore = '(\\.|[^a-z])+',
strip_accents = 1, lower = 1, overwrite = 0) PRAGMA для создания индекса FTS для указанной таблицы.
| Имя | Тип | Описание |
|---|---|---|
input_table | VARCHAR | Полное имя указанной таблицы, например, 'table_name' или 'main.table_name'
|
input_id | VARCHAR | Имя столбца идентификатора документа, например, 'document_identifier'
|
input_values… | VARCHAR | Имена столбцов текстовых полей, которые необходимо индексировать (переменное число), например, 'text_field_1', 'text_field_2', …, 'text_field_N', или '\*' для всех столбцов в input_table типа VARCHAR
|
stemmer | VARCHAR | Тип стемера, который необходимо использовать. Один из 'arabic', 'basque', 'catalan', 'danish', 'dutch', 'english', 'finnish', 'french', 'german', 'greek', 'hindi', 'hungarian', 'indonesian', 'irish', 'italian', 'lithuanian', 'nepali', 'norwegian', 'porter', 'portuguese', 'romanian', 'russian', 'serbian', 'spanish', 'swedish', 'tamil', 'turkish', или 'none', если стемминг не требуется. По умолчанию 'porter'
|
stopwords | VARCHAR | Полное имя таблицы, содержащей один столбец VARCHAR с желаемыми стоп-словами, или 'none', если стоп-слова не должны использоваться. По умолчанию 'english' для предварительно определенного списка из 571 английского стоп-слова |
ignore | VARCHAR | Регулярное выражение шаблонов, которые следует игнорировать. По умолчанию '(\\.|[^a-z])+', игнорируя все экранированные и не буквенно-цифровые строчные символы |
strip_accents | BOOLEAN | Нужно ли удалять знаки ударения (например, преобразовать á в a). По умолчанию 1
|
lower | BOOLEAN | Нужно ли преобразовать весь текст в нижний регистр. По умолчанию 1
|
overwrite | BOOLEAN | Перезаписывать ли существующий индекс в таблице. По умолчанию 0
|
Этот PRAGMA строит индекс в только что созданной схеме. Схема будет названа в честь таблицы входных данных: если индекс создается для таблицы 'main.table_name', то схема будет названа 'fts_main_table_name'.
PRAGMA drop_fts_index
drop_fts_index(input_table)
Удаляет индекс FTS для указанной таблицы.
| Имя | Тип | Описание |
|---|---|---|
input_table | VARCHAR | Полное имя входной таблицы, например, 'table_name' или 'main.table_name'
|
match_bm25 Функция
match_bm25(input_id, query_string, fields := NULL, k := 1.2, b := 0.75, conjunctive := 0)
При построении индекса создается эта макрос извлечения, которая может использоваться для поиска в индексе.
| Имя | Тип | Описание |
|---|---|---|
input_id | VARCHAR | Имя столбца идентификатора документа, например, 'document_identifier'
|
query_string | VARCHAR | Строка для поиска в индексе |
fields | VARCHAR | Список полей для поиска, разделенных запятыми, например, 'text_field_2, text_field_N'. По умолчанию NULL для поиска во всех индексированных полях |
k | DOUBLE | Параметр k1 в модели извлечения Okapi BM25. По умолчанию 1.2
|
b | DOUBLE | Параметр b в модели извлечения Okapi BM25. По умолчанию 0.75
|
conjunctive | BOOLEAN | Требуется ли выполнение конъюнктивного запроса, т.е. все термины в строке запроса должны присутствовать для извлечения документа |
stem Функция
stem(input_string, stemmer)
Приводит слова к их основе. Используется расширением внутри.
| Имя | Тип | Описание |
|---|---|---|
input_string | VARCHAR | Столбец или константа, подлежащие стеммингу. |
stemmer | VARCHAR | Тип стемера, который необходимо использовать. Один из 'arabic', 'basque', 'catalan', 'danish', 'dutch', 'english', 'finnish', 'french', 'german', 'greek', 'hindi', 'hungarian', 'indonesian', 'irish', 'italian', 'lithuanian', 'nepali', 'norwegian', 'porter', 'portuguese', 'romanian', 'russian', 'serbian', 'spanish', 'swedish', 'tamil', 'turkish', или 'none' если стемминг не требуется. |
Пример использования
Создайте таблицу и заполните ее текстовыми данными:
CREATE TABLE documents (
document_identifier VARCHAR,
text_content VARCHAR,
author VARCHAR,
doc_version INTEGER
);
INSERT INTO documents
VALUES ('doc1',
'The mallard is a dabbling duck that breeds throughout the temperate.',
'Hannes Mühleisen',
3),
('doc2',
'The cat is a domestic species of small carnivorous mammal.',
'Laurens Kuiper',
2
); Создайте индекс и сделайте столбцы text_content и author доступными для поиска.
PRAGMA create_fts_index(
'documents', 'document_identifier', 'text_content', 'author'
); Ищите в индексе поля author документы, написанные Muhleisen. Это вернет doc1:
SELECT document_identifier, text_content, score
FROM (
SELECT *, fts_main_documents.match_bm25(
document_identifier,
'Muhleisen',
fields := 'author'
) AS score
FROM documents
) sq
WHERE score IS NOT NULL
AND doc_version > 2
ORDER BY score DESC; | document_identifier | text_content | score |
|---|---|---|
| doc1 | Утка-кряква — это утка-ныряльщик, которая размножается по всей умеренной зоне. | 0.0 |
Ищите документы о small cats. Это вернет doc2:
SELECT document_identifier, text_content, score
FROM (
SELECT *, fts_main_documents.match_bm25(
document_identifier,
'small cats'
) AS score
FROM documents
) sq
WHERE score IS NOT NULL
ORDER BY score DESC; | document_identifier | text_content | score |
|---|---|---|
| doc2 | Кот — это домашний вид небольшого хищного млекопитающего. | 0.0 |
Предупреждение Индекс FTS не будет автоматически обновляться при изменении входной таблицы. Обходным решением этой проблемы является пересоздание индекса для обновления.
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/extensions/full_text_search.html