lakebase_tokenizer

Расширение lakebase_tokenizer добавляет настраиваемую токенизацию целого слова в полнотекстовый поиск PostgreSQL в Lakebase. Конфигурации текстового поиска, построенные с расширением, работают с to_tsvectorоператором @@ , функциями ранжирования и индексами GIN. Вы также можете использовать сгенерированные tsvector значения с lakebase_text для рейтинга BM25.

Расширение предоставляет tokenizer_wholeword шаблон через стандартный интерфейс текстового словаря PostgreSQL. Шаблон поддерживает строчное преобразование, нормализацию в Юникоде, удаление ударения, удаление английского притяжательного значения, пользовательские стоп-слова, одиночные синонимы и английский стеминг.

Install

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

CREATE SCHEMA IF NOT EXISTS tokenizer_ext;
CREATE EXTENSION IF NOT EXISTS lakebase_tokenizer WITH SCHEMA tokenizer_ext;

Расширение можно переместить. Можно заменить tokenizer_ext другую схему при установке.

Обновление расширения

Новый релиз Lakebase Search может добавить функции, исправления и улучшения производительности. PostgreSQL не обновляет автоматически установленную версию расширения. Проверьте установленные и последние доступные версии:

SELECT installed_version, default_version
FROM pg_available_extensions
WHERE name = 'lakebase_tokenizer';

Обновите расширение до последней доступной версии:

ALTER EXTENSION lakebase_tokenizer UPDATE;

ALTER EXTENSION не восстанавливает сохранённые tsvector значения и не восстанавливает зависимые GIN или lakebase_bm25 индексы. Если обновление изменяет выход токенизации, генерируйте сохранённые tsvector значения и следуйте примечаниям релиза для необходимого поддержания индекса.

Быстрый старт с tokenizer_wholeword

Следующий пример создаёт словарь из шаблона tokenizer_wholeword , затем отображает распространённые типы токена PostgreSQL в конфигурации текстового поиска:

CREATE TEXT SEARCH DICTIONARY documents_dict (
  TEMPLATE          = tokenizer_ext.tokenizer_wholeword,
  Lowercase         = 'true',
  StripAccents      = 'true',
  Stemmer           = 'english'
);

CREATE TEXT SEARCH CONFIGURATION documents_cfg (COPY = pg_catalog.simple);

ALTER TEXT SEARCH CONFIGURATION documents_cfg
  ALTER MAPPING FOR asciiword, word, numword, hword_numpart, hword_part, hword_asciipart
  WITH documents_dict;

Используйте конфигурацию для создания tsvector, создания индекса GIN и запуска полнотекстовых запросов:

CREATE TABLE documents (
  id            BIGSERIAL PRIMARY KEY,
  body          TEXT NOT NULL,
  search_vector TSVECTOR GENERATED ALWAYS AS (
    to_tsvector('documents_cfg', body)
  ) STORED
);

INSERT INTO documents (body) VALUES
  ('Cats are running near the café.'),
  ('A dog is sleeping in the house.');

CREATE INDEX documents_search_idx ON documents USING gin (search_vector);

SELECT id, body
FROM documents
WHERE search_vector @@ plainto_tsquery('documents_cfg', 'running café');

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

Шаблон: tokenizer_wholeword.

Принцип работы

Для каждого токена, передаваемого в словарь парсером текстового поиска PostgreSQL, tokenizer_wholeword применяются следующие операции:

  1. Lowercase: Конвертировать токен в строчную букву.
  2. Normalize: Применить нормализацию Unicode.
  3. StripAccents: Уберите акценты.
  4. EnglishPossessive: Убрать английский притяжательный суффикс, если остаётся хотя бы один иероглиф.
  5. Stopwords: Не выпускать lexeme и останавливать обработку, если токен совпадает с настроенным стоп-вордом. Токен опускается в сгенерированном tsvector.
  6. Synonyms: Выпустить настроенную замену и прекратить обработку, если токен совпадает с синонимом.
  7. Stemmer: Если синоним не совпадает, а стемминг включен, применяйте английский stemmer.

Добавьте стоп-слова и синонимы

Шаблон может загружать пользовательские стоп-слова и синонимы из SQL-таблицlakebase_tokenizer_stopwords, tokenizer_wholeword управляемых расширениями, и lakebase_tokenizer_synonyms. Столбец name группирует строки в набор, который вы выбираете с Stopwords помощью опции или Synonyms словаря.

INSERT INTO tokenizer_ext.lakebase_tokenizer_stopwords (name, word) VALUES
  ('app_stopwords', 'the'),
  ('app_stopwords', 'and'),
  ('app_stopwords', 'or');

INSERT INTO tokenizer_ext.lakebase_tokenizer_synonyms (name, word, synonym) VALUES
  ('app_synonyms', 'usa', 'united_states'),
  ('app_synonyms', 'uk', 'united_kingdom');

Ссылайтесь на наборы при создании или изменении словаря tokenizer_wholeword :

ALTER TEXT SEARCH DICTIONARY documents_dict (
  Stopwords = 'app_stopwords',
  Synonyms  = 'app_synonyms'
);

Расширение сравнивает стоп-слова и синонимные исходные слова с каждым токеном после применения , , , и EnglishPossessive, но до применения Stemmer. StripAccentsNormalizeLowercase Записи в каталоге не преобразуются автоматически, поэтому храните их в точной форме, созданной этими включёнными опциями:

  • С Lowercase = 'true', используйте строчные буквы. С Lowercase = 'false', заглавная буква должна совпадать с токеном.
  • При Normalize включённом сохранении записи в выбранной форме нормализации Unicode.
  • С , храните StripAccents = 'true'форму с акцентами. Например, храните cafe в соответствии caféс .
  • Храните форму перед высадкой. Например, при Stemmer = 'english', запись run не совпадает runningс . Добавьте running для фильтрации или замените этот токен.

Имена множеств могут содержать до 256 байт. Слова и синонимы могут содержать до 1024 байт. Каждый именованный стоп-ворд или набор синонимов может содержать до 100 000 строк.

Замена синонима испускается точно так же, как хранится, и не обрабатывается стемером. Синонимы поддерживают одну замену для каждого исходного слова. Чтобы представить многословную замену как одну лексему, используйте разделитель, например, подчёркивание, как в united_states.

После изменения множества владелец каждого словаря, на который он ссылается, должен выполнить no-op ALTER TEXT SEARCH DICTIONARY для принудительной перезагрузки:

ALTER TEXT SEARCH DICTIONARY documents_dict (dummy);

Такой dummy опции на tokenizer_wholeword. не существует. Пропуск значения заставляет PostgreSQL удалить эту несуществующую опцию, которая аннулирует кэш без изменения настроенных опций словаря.

После перезагрузки словаря сгенерируйте сохраненные tsvector значения, переписывая исходные строки:

UPDATE documents SET body = body;

Роли и доступ

Используйте две роли для разделения доступа к приложениям от администрирования токенайзеров:

  • app_role использует существующие словари. Он должен USAGE быть на соответствующих схемах и SELECT в таблицах каталога расширений, но не обязан владеть словареми.
  • tokenizer_admin управляет наборами стоп-вордов и синонимов, создаёт и владеет словарами и конфигурациями поиска текста, а также запускает команду перезагрузки после изменения набора.

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

GRANT USAGE ON SCHEMA tokenizer_ext TO app_role, tokenizer_admin;

GRANT SELECT ON
  tokenizer_ext.lakebase_tokenizer_stopwords,
  tokenizer_ext.lakebase_tokenizer_synonyms
TO app_role;

GRANT SELECT, INSERT, UPDATE, DELETE ON
  tokenizer_ext.lakebase_tokenizer_stopwords,
  tokenizer_ext.lakebase_tokenizer_synonyms
TO tokenizer_admin;

tokenizer_admin Также необходимо CREATE в схеме, где хранятся словари и конфигурации поиска текста. Создайте эти объекты как tokenizer_admin, или передайте их право собственности на них. Запись доступа к таблицам каталогов не даёт права собственности на существующие словари.

Опции

Укажите tokenizer_wholeword опции в CREATE TEXT SEARCH DICTIONARY или ALTER TEXT SEARCH DICTIONARY. Названия опционов не зависят от регистра.

Опция Type Default Description
Lowercase boolean true Преобразует токены в строчные буквы перед применением других операций. Stemmer = 'english' требуется Lowercase = 'true'.
Normalize NFC, NFD, NFKC, NFKD или none none Применяется выбранная форма нормализации Unicode. Это канонизирует представление, но не убирает символы. Например, NFC делает предварительно композиционным é , а e затем эквивалентным сочетающим острым ударением.
EnglishPossessive boolean true Убирает конечный 's, ’sили 's когда хотя бы один символ предшествует суффиксу. Самостоятельный суффикс остался без изменений.
StripAccents boolean false Применяет нормализацию NFKD и удаляет комбинирующие метки. Например, café преобразуется в cafe. Когда эта опция включена, её опустить Normalize , потому что шаг NFKD делает любую отдельную нормализацию Unicode избыточной.
Stopwords Название сета Нет Использует именованный набор из tokenizer_ext.lakebase_tokenizer_stopwords.
Synonyms Название сета Нет Использует именованный набор однозначных замен из tokenizer_ext.lakebase_tokenizer_synonyms.
Stemmer english Нет Использует комплектный английский стемер Snowball 3.1.0. Опустите эту опцию, чтобы отключить стемирование. В стеммере нет списка стоп-слов.

Таблицы каталога

Таблица Columns Description
lakebase_tokenizer_stopwords name text, word text Хранилища, названные наборами стоп-вордов для шаблонов токенайзеров, поддерживающих Stopwords. Первичный ключ — (name, word).
lakebase_tokenizer_synonyms name text, word text, synonym text Хранилища, названные one-to-one заменяющими шаблоны токенайзеров, поддерживающие Synonyms. Первичный ключ — (name, word).

Используйте рейтинг BM25 с lakebase_text

Конфигурации поиска текста, построенные на lakebase_tokenizer , создают стандартные значения PostgreSQL tsvector , совместимые с lakebase_text. Чтобы использовать рейтинг релевантности BM25 и поиск топ-K, создайте lakebase_bm25 индекс в том же tsvector столбце. Для установки, создания индекса и синтаксиса запросов см. lakebase_text.

Дальнейшие действия