lakebase_tokenizer
lakebase_tokenizer 拡張は、Lakebase の PostgreSQL 全文検索に設定可能な単語全体のトークン化を追加します。拡張機能で構築されたテキスト検索設定は、to_tsvector、@@ 演算子、ランキング関数、および GIN インデックスで機能します。また、BM25 ランキングのために、生成された tsvector 値を lakebase_text と共に使用することもできます。
この拡張機能は、PostgreSQL の標準テキスト検索辞書インターフェイスを介して tokenizer_wholeword Template を提供します。この Template は、小文字変換、Unicode 正規化、アクセント文字の削除、英語の所有格の削除、カスタムのストップワード、一対一の同義語、および英語のステミングをサポートしています。
インストール
データベースに拡張機能をインストールします。このページの例では、拡張機能のオブジェクトを識別しやすくするために専用のスキーマを使用しています:
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 Templateからディクショナリを作成し、テキスト検索構成で一般的な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é');
ドキュメントとクエリーに同じテキスト検索構成を使用することで、両側で同じトークン化戦略とオプションが適用されるようにします。
Template: tokenizer_wholeword
仕組み
PostgreSQL のテキスト検索パーサーによって辞書に渡された各トークンに対して、tokenizer_wholeword は次の操作を適用します:
Lowercase:トークンを小文字に変換します。Normalize:Unicode 正規化を適用します。StripAccents:アクセントを削除します。EnglishPossessive: Remove an English possessive suffix when at least one character remains.Stopwords:構成済みのストップワードにトークンが一致した場合、語彙素を出力せず、処理を停止します。生成されたtsvectorからトークンが省略されます。Synonyms: 設定された置換を出力し、トークンがシノニムと一致する場合は処理を停止します。Stemmer: 一致する同義語がなく、ステミングが有効な場合は、English ステマーを適用します。
ストップワードとシノニムを追加する
The tokenizer_wholeword Template は、拡張機能で管理される SQL テーブル lakebase_tokenizer_stopwords および 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'
);
この拡張機能は、Lowercase、Normalize、StripAccents、EnglishPossessiveを適用した後、Stemmerを適用する前に、各トークンとストップワードおよび同義語のソースワードを比較します。カタログエントリは自動的に変換されないため、有効にしたオプションによって生成された正確な形式で保存します:
Lowercase = 'true'では、小文字のエントリを使用してください。Lowercase = 'false'では、大文字と小文字がトークンと一致している必要があります。Normalizeを有効にして、選択した Unicode 正規化フォームにエントリーを格納します。StripAccents = 'true'を使用して、アクセントを除去した形式で保存します。たとえば、cafeを保存してcaféに一致させます。- ステミングの前にフォームを保存します。たとえば、
Stemmer = 'english'を使用した場合、runエントリはrunningと一致しません。runningを追加してトークンをフィルターまたは置換します。
セット名には最大256バイトを含めることができます。単語と同義語には最大1,024バイトを含めることができます。名前付きのストップワードまたは同義語セットには、それぞれ最大100,000行を含めることができます。
シノニムの置換は、保存されたとおりに出力され、ステマーによる処理は行われません。シノニムは、各ソースワードに対して 1 つの置換をサポートします。複数の単語からなる置き換えを 1 つの語lexemeとして表現するには、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;
ロールとアクセス
2 つのロールを使用して、アプリケーションアクセスをトークナイザーの管理から分離します。
app_role既存のディクショナリを使用します。関連するスキーマに対してUSAGEが、拡張カタログテーブルに対してSELECTが必要ですが、ディクショナリを所有する必要はありません。tokenizer_adminストップワードとシノニムのセットを管理し、辞書とテキスト検索構成を作成して所有し、セットの変更後に reload コマンドを実行します。
拡張機能のスキーマとカタログのテーブルへのアクセス権を付与します。
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として作成するか、所有権をに譲渡します。カタログテーブルへの書き込みアクセス権では、既存の辞書の所有権は付与されません。
オプション
CREATE TEXT SEARCH DICTIONARYまたはALTER TEXT SEARCH DICTIONARYでtokenizer_wholewordオプションを指定します。オプション名では大文字と小文字が区別されません。
オプション | Type | デフォルト | 説明 |
|---|---|---|---|
| boolean |
| 他の操作を適用する前に、トークンを小文字に変換します。 |
|
|
| 選択した Unicode 正規化形式を適用します。これにより表現が正規化されますが、文字は削除されません。たとえば、 |
| boolean |
| 接尾辞の前に少なくとも1つの文字がある場合、末尾の |
| boolean |
| NFKD正規化を適用し、結合文字を削除します。たとえば、 |
| 名前を設定 | なし | Uses the named set from |
| 名前を設定 | なし |
|
|
| なし | バンドル版 Snowball 3.1.0 を使用します英語のステマー。ステミングを無効にするには、このオプションを省略します。ステマーにはストップワードリストが含まれていません。 |
Catalog テーブル
テーブル | 列 | 説明 |
|---|---|---|
|
|
|
|
|
|
lakebase_text で BM25 ランキングを使用する
lakebase_tokenizerで構築されたテキスト検索構成は、lakebase_textと互換性のある標準の PostgreSQL tsvector 値を生成します。BM25 関連性ランキングとトップ K 取得を使用するには、同じ tsvector 列に lakebase_bm25 インデックスを作成します。インストール、インデックスの作成、クエリー構文については、lakebase_text を参照してください。