このトピックでは、Nova BM25 の全文検索インデックスを作成および管理する方法と、中国語の形態素解析辞書を設定する方法について説明します。Nova BM25 は、AnalyticDB for PostgreSQL が提供する高性能な全文検索ソリューションです。これは nova_bm25 拡張機能に基づいて実装されています。SQL 関数は bm25 スキーマにあり、インデックスアクセスメソッド名は nova_bm25 です。
クイックスタートガイドについては、「Nova BM25 クイックスタート」をご参照ください。完全な関数 API リファレンスについては、「関数 API リファレンス」をご参照ください。
インデックスの作成
サンプルテーブルの作成
次の例では、後のインデックス作成の参考として、テキスト、数値、タイムスタンプ、ブールフィールドなど、複数のフィールドタイプを持つビジネステーブルを作成します。
CREATE TABLE docs (
id bigint PRIMARY KEY,
title text,
body text,
category text,
rating integer,
publish_at timestamp,
in_stock boolean
) DISTRIBUTED BY (id);BM25 インデックスの作成
サンプルテーブルに Nova BM25 インデックスを作成します。WITH 句を使用して、各フィールドタイプに適切なインデックス設定を指定します。フィールドを正しく設定することは、検索精度とパフォーマンスに直接影響します。
CREATE INDEX docs_bm25_idx ON docs
USING nova_bm25 (title, body, category, rating, publish_at, in_stock)
WITH (
text_fields = '{
"title": {"tokenizer": {"type": "jieba"}},
"body": {"tokenizer": {"type": "jieba"}},
"category": {"tokenizer": {"type": "keyword"}}
}',
numeric_fields = '{"rating": {}}',
datetime_fields = '{"publish_at": {}}',
boolean_fields = '{"in_stock": {}}'
);インデックスフィールドの設定
インデックスを作成する際、WITH 句を使用して、検索対象となる各フィールドの設定を指定する必要があります。次の表に、各フィールドタイプの設定パラメーターを示します。
パラメーター | 適用可能なフィールドタイプ | 説明 | 例 |
| text、varchar | テキストフィールド。形態素解析を制御するために、トークナイザータイプを指定する必要があります。 |
|
| integer、bigint、float など | 数値フィールド。範囲クエリと数値によるソートをサポートします。 |
|
| timestamp、date | タイムスタンプフィールド。時間範囲クエリをサポートします。 |
|
| boolean | ブールフィールド。true/false フィルタリングをサポートします。 |
|
| json、jsonb |
|
|
フィールド設定の選択
効率的な全文検索インデックスを構築するには、各フィールドに正しい設定タイプを選択することが不可欠です。設定タイプによって、フィールドの検索動作と利用可能なクエリメソッドが決まります。次の表は、一般的なフィールドの目的と推奨される設定の一覧です。
フィールドの目的 | 設定 | 例 |
中国語のタイトルと本文 |
| title、body |
カテゴリやステータスなど、値全体を対象とするフィールド |
| category、status |
評価や価格などの数値フィールド |
| rating、price |
公開時間などのタイムスタンプフィールド |
| publish_at |
在庫状況などのブールフィールド |
| in_stock |
JSON フィールド |
| metadata |
テキストフィールドのトークナイザー選択ガイド
テキストフィールド用の正しいトークナイザーを選択することは、検索結果に直接影響します。次の表は、一般的なトークナイザータイプとそれらの適用シナリオの一覧です。
トークナイザータイプ | 適用シナリオ | 説明 |
| 中国語テキスト | Jieba トークナイザーに基づき、中国語のセマンティックなトークン化をサポートし、カスタム辞書も使用できます。 |
| 英語テキスト | スペースと句読点でテキストを分割します。英語やその他の欧米言語に適しています。 |
| 完全一致フィールド | 形態素解析を行いません。フィールド値全体を 1 つの検索単位として扱います。カテゴリ、タグ、ステータスコードなどのフィールドに適しています。 |
| きめ細かいマッチング | n-gram を使用してテキストを分割し、部分一致とあいまい検索をサポートしており、前方一致検索や部分文字列検索のシナリオに適しています。 |
形態素解析結果の検証
インデックスを作成した後、トークン化デバッグ機能を使用して、実際のトークン化の結果が期待どおりであることを確認することをお勧めします。次の例では、入力テキストに対する jieba トークナイザーのトークン化の結果を表示する方法を示します。
SELECT * FROM bm25.debug_tokenizer('cloud-native database', 'jieba');増分データのクエリ
Nova BM25 は、ニアリアルタイムのクエリモードをサポートしています。新規に書き込まれたデータや更新されたデータは、短い遅延の後に検索可能になります。次のパラメーターとコマンドを使用して増分データのクエリに関する動作を制御し、データの鮮度とクエリパフォーマンスのバランスを取ることができます。
query_skip_mutable パラメーターを使用して、最新の増分データをクエリ対象に含めるかどうかを制御します。
パラメーター | 説明 |
query_skip_mutable | デフォルト値: |
インデックス作成時にこのパラメーターを設定します。
CREATE INDEX docs_bm25_idx ON docs
USING nova_bm25 (title, body)
WITH (text_fields = '{"title": {"tokenizer": {"type": "jieba"}}, "body": {"tokenizer": {"type": "jieba"}}}', query_skip_mutable = false);このパラメーターは ALTER INDEX を使用して変更します。
ALTER INDEX docs_bm25_idx SET (query_skip_mutable = false);
ALTER INDEX docs_bm25_idx SET (query_skip_mutable = true);また、SET コマンドを使用して、この動作をセッションレベルで制御することもできます。セッションパラメータ nova_bm25.query_include_mutable は、インデックスパラメータ query_skip_mutable と論理的に逆の動作をします。nova_bm25.query_include_mutable を on に設定すると、クエリに最新の増分データが含まれるようになります。
-- 現在のセッションで増分データを含める
SET nova_bm25.query_include_mutable = on;
-- デフォルトの動作にリセットする
RESET nova_bm25.query_include_mutable;インデックスの変更と再構築
Nova BM25 インデックスの作成後は、トークナイザータイプやフィールドマッピングなどのフィールド設定を ALTER INDEX で直接変更することはできません。インデックス設定を変更するには、インデックスを削除してから再作成する必要があります。
インデックスを削除して再作成し、設定を変更します。
DROP INDEX docs_bm25_idx;
-- インデックスを再作成
CREATE INDEX docs_bm25_idx ON docs USING nova_bm25 (...) WITH (...);インデックス設定を変更する必要はないが、インデックスフラグメントをクリーンアップしたり、インデックスデータを更新したりする必要がある場合は、REINDEX コマンドを使用してインデックスを再構築できます。
REINDEX INDEX docs_bm25_idx;中国語辞書の管理
Nova BM25 は、中国語テキスト処理に jieba トークナイザーを使用します。ビジネスシナリオにおける専門用語や類義語の検索要件を満たすために、辞書管理を通じてトークン化の動作をカスタマイズできます。
カスタム用語の追加
専門用語やビジネス用語を jieba トークナイザーのカスタム辞書に追加することで、トークナイザーがこれらの用語を正しく識別し、誤って分割されるのを防ぐことができます。用語を追加した後、変更を有効にするには、辞書をリロードする必要があります。
SELECT bm25.add_dict_word('jieba', 'product_terms', 'cloud-native database', 10000, 'n');
SELECT bm25.reload_dict('jieba', 'product_terms');シノニムの設定
シノニム辞書を設定して、意味が似ている複数の用語を同じ検索結果にマッピングすることで、検索範囲を拡大し、再現率を向上させます。
SELECT bm25.add_dict_word('synonym', 'product_synonyms', 'postgresql,postgres,pg');
SELECT bm25.reload_dict('synonym', 'product_synonyms');辞書の有効性の検証
カスタム用語やシノニムを追加した後、形態素解析のデバッグ機能を使用して、辞書設定が有効になっていることや、用語が正しく識別されていることを検証することを推奨します。
SELECT * FROM bm25.debug_tokenizer('cloud-native database', 'jieba');定期メンテナンス
定期的にメンテナンスを実行することで、Nova BM25 インデックスのクエリパフォーマンスとデータ整合性を維持できます。次の表に、一般的なメンテナンス操作とその目的を示します。
操作 | 説明 |
| 削除されたデータが占有していた領域を再利用し、テーブルのストレージを最適化します。 |
| インデックスを再構築してインデックスフラグメントをクリーンアップし、クエリパフォーマンスを回復します。 |
| 使用されなくなったインデックスを削除して、ストレージ領域を解放します。 |
VACUUM docs;
REINDEX INDEX docs_bm25_idx;
DROP INDEX docs_bm25_idx;