Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Расширение 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 применяются следующие операции:
-
Lowercase: Конвертировать токен в строчную букву. -
Normalize: Применить нормализацию Unicode. -
StripAccents: Уберите акценты. -
EnglishPossessive: Убрать английский притяжательный суффикс, если остаётся хотя бы один иероглиф. -
Stopwords: Не выпускать lexeme и останавливать обработку, если токен совпадает с настроенным стоп-вордом. Токен опускается в сгенерированномtsvector. -
Synonyms: Выпустить настроенную замену и прекратить обработку, если токен совпадает с синонимом. -
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.