メインコンテンツまでスキップ

lakebase_tokenizer

lakebase_tokenizer 拡張は、Lakebase の PostgreSQL 全文検索に設定可能な単語全体のトークン化を追加します。拡張機能で構築されたテキスト検索設定は、to_tsvector、@@ 演算子、ランキング関数、および GIN インデックスで機能します。また、BM25 ランキングのために、生成された tsvector 値を lakebase_text と共に使用することもできます。

この拡張機能は、PostgreSQL の標準テキスト検索辞書インターフェイスを介して tokenizer_wholeword Template を提供します。この Template は、小文字変換、Unicode 正規化、アクセント文字の削除、英語の所有格の削除、カスタムのストップワード、一対一の同義語、および英語のステミングをサポートしています。

インストール​

データベースに拡張機能をインストールします。このページの例では、拡張機能のオブジェクトを識別しやすくするために専用のスキーマを使用しています:

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

拡張機能は再配置可能です。インストール時に tokenizer_ext を別のスキーマに置き換えることができます。

拡張機能をアップグレードする​

新しいLakebase Searchリリースでは、機能、修正、パフォーマンスの改善が追加される場合があります。PostgreSQLは、インストール済みの拡張機能のバージョンを自動的には更新しません。インストール済みバージョンと利用可能な最新バージョンを確認します:

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

拡張機能を最新の利用可能なバージョンに更新します。

SQL
ALTER EXTENSION lakebase_tokenizer UPDATE;

ALTER EXTENSION 保存された tsvector 値を再生成したり、依存する GIN または lakebase_bm25 インデックスを再構築したりしません。更新によってトークン化の出力が変更される場合は、保存された tsvector 値を再生成し、必要なインデックスのメンテナンスについてはリリースノートに従ってください。

~を使用したクイック起動 tokenizer_wholeword​

次の例では、tokenizer_wholeword Templateからディクショナリを作成し、テキスト検索構成で一般的なPostgreSQLトークンタイプをそれにマッピングします。

SQL
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 インデックスを作成し、全文クエリーを実行するための構成を使用します。

SQL
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 は次の操作を適用します:

  1. Lowercase:トークンを小文字に変換します。
  2. Normalize:Unicode 正規化を適用します。
  3. StripAccents:アクセントを削除します。
  4. EnglishPossessive: Remove an English possessive suffix when at least one character remains.
  5. Stopwords:構成済みのストップワードにトークンが一致した場合、語彙素を出力せず、処理を停止します。生成されたtsvectorからトークンが省略されます。
  6. Synonyms: 設定された置換を出力し、トークンがシノニムと一致する場合は処理を停止します。
  7. Stemmer: 一致する同義語がなく、ステミングが有効な場合は、English ステマーを適用します。

ストップワードとシノニムを追加する​

The tokenizer_wholeword Template は、拡張機能で管理される SQL テーブル lakebase_tokenizer_stopwords および lakebase_tokenizer_synonyms からカスタムのストップワードと類義語を読み込むことができます。name 列は、Stopwords または Synonyms の辞書オプションで選択したセットに行をグループ化します。

SQL
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 辞書の作成時または変更時にセットを参照します。

SQL
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 を実行して強制的に再読み込みを行う必要があります:

SQL
ALTER TEXT SEARCH DICTIONARY documents_dict (dummy);

dummyオプションはtokenizer_wholewordに存在しません。値を省略すると、PostgreSQLはこの存在しないオプションを削除するように求められます。これにより、辞書の構成されたオプションを変更せずにキャッシュが無効になります。

辞書をリロードした後、ソース行を書き直して保存された tsvector 値を再生成します。

SQL
UPDATE documents SET body = body;

ロールとアクセス​

2 つのロールを使用して、アプリケーションアクセスをトークナイザーの管理から分離します。

  • app_role 既存のディクショナリを使用します。関連するスキーマに対してUSAGEが、拡張カタログテーブルに対してSELECTが必要ですが、ディクショナリを所有する必要はありません。
  • tokenizer_admin ストップワードとシノニムのセットを管理し、辞書とテキスト検索構成を作成して所有し、セットの変更後に reload コマンドを実行します。

拡張機能のスキーマとカタログのテーブルへのアクセス権を付与します。

SQL
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

デフォルト

説明

Lowercase

boolean

true

他の操作を適用する前に、トークンを小文字に変換します。Stemmer = 'english'にはLowercase = 'true'が必要です。

Normalize

NFC、NFD、NFKC、NFKD、または none

none

選択した Unicode 正規化形式を適用します。これにより表現が正規化されますが、文字は削除されません。たとえば、NFC は、合成済みの é と、その後に結合アクセント記号の同等文字が続く e を作成します。

EnglishPossessive

boolean

true

接尾辞の前に少なくとも1つの文字がある場合、末尾の's、’s、または'sを削除します。単独の接尾辞は変更されません。

StripAccents

boolean

false

NFKD正規化を適用し、結合文字を削除します。たとえば、café は cafe になります。このオプションを有効にすると、NFKDステップによって個別のUnicode正規化が冗長になるため、Normalize を省略します。

Stopwords

名前を設定

なし

Uses the named set from tokenizer_ext.lakebase_tokenizer_stopwords.

Synonyms

名前を設定

なし

tokenizer_ext.lakebase_tokenizer_synonymsからの名前付き1対1置換のセットを使用します。

Stemmer

english

なし

バンドル版 Snowball 3.1.0 を使用します英語のステマー。ステミングを無効にするには、このオプションを省略します。ステマーにはストップワードリストが含まれていません。

オプション

Type

デフォルト

説明

Lowercase

boolean

true

他の操作を適用する前に、トークンを小文字に変換します。Stemmer = 'english'にはLowercase = 'true'が必要です。

Normalize

NFC、NFD、NFKC、NFKD、または none

none

選択した Unicode 正規化形式を適用します。これにより表現が正規化されますが、文字は削除されません。たとえば、NFC は、合成済みの é と、その後に結合アクセント記号の同等文字が続く e を作成します。

EnglishPossessive

boolean

true

接尾辞の前に少なくとも1つの文字がある場合、末尾の's、’s、または'sを削除します。単独の接尾辞は変更されません。

StripAccents

boolean

false

NFKD正規化を適用し、結合文字を削除します。たとえば、café は cafe になります。このオプションを有効にすると、NFKDステップによって個別のUnicode正規化が冗長になるため、Normalize を省略します。

Stopwords

名前を設定

なし

Uses the named set from tokenizer_ext.lakebase_tokenizer_stopwords.

Synonyms

名前を設定

なし

tokenizer_ext.lakebase_tokenizer_synonymsからの名前付き1対1置換のセットを使用します。

Stemmer

english

なし

バンドル版 Snowball 3.1.0 を使用します英語のステマー。ステミングを無効にするには、このオプションを省略します。ステマーにはストップワードリストが含まれていません。

Catalog テーブル​

テーブル

列

説明

lakebase_tokenizer_stopwords

name text, word text

StopwordsをサポートするトークナイザーTemplateの名前付きストップワードセットを保存します。プライマリーキーは (name, word) です。

lakebase_tokenizer_synonyms

name text、word text、 synonym text

Synonyms をサポートするトークナイザー Template の名前付き 1 対 1 の置換を格納します。プライマリーキーは (name, word) です。

テーブル

列

説明

lakebase_tokenizer_stopwords

name text, word text

StopwordsをサポートするトークナイザーTemplateの名前付きストップワードセットを保存します。プライマリーキーは (name, word) です。

lakebase_tokenizer_synonyms

name text、word text、 synonym text

Synonyms をサポートするトークナイザー Template の名前付き 1 対 1 の置換を格納します。プライマリーキーは (name, word) です。

lakebase_text で BM25 ランキングを使用する​

lakebase_tokenizerで構築されたテキスト検索構成は、lakebase_textと互換性のある標準の PostgreSQL tsvector 値を生成します。BM25 関連性ランキングとトップ K 取得を使用するには、同じ tsvector 列に lakebase_bm25 インデックスを作成します。インストール、インデックスの作成、クエリー構文については、lakebase_text を参照してください。

次のステップ​