Spec-Zone.ru › DuckDB

Расширение полнотекстового поиска

Расширение полнотекстового поиска — это расширение 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

Spec-Zone.ru

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