すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:Nova BM25 のインデックスと辞書の管理

最終更新日:Aug 13, 2026

このトピックでは、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_fields

text、varchar

テキストフィールド。形態素解析を制御するために、トークナイザータイプを指定する必要があります。

{"title": {"tokenizer": {"type": "jieba"}}}

numeric_fields

integer、bigint、float など

数値フィールド。範囲クエリと数値によるソートをサポートします。

{"rating": {}}

datetime_fields

timestamp、date

タイムスタンプフィールド。時間範囲クエリをサポートします。

{"publish_at": {}}

boolean_fields

boolean

ブールフィールド。true/false フィルタリングをサポートします。

{"in_stock": {}}

json_fields

json、jsonb

JSON フィールド。JSON データ内のキーと値のペアのインデックス化をサポートします。

{"metadata": {}}

フィールド設定の選択

効率的な全文検索インデックスを構築するには、各フィールドに正しい設定タイプを選択することが不可欠です。設定タイプによって、フィールドの検索動作と利用可能なクエリメソッドが決まります。次の表は、一般的なフィールドの目的と推奨される設定の一覧です。

フィールドの目的

設定

中国語のタイトルと本文

text_fields (jieba を使用)

title、body

カテゴリやステータスなど、値全体を対象とするフィールド

text_fields (keyword を使用)

category、status

評価や価格などの数値フィールド

numeric_fields

rating、price

公開時間などのタイムスタンプフィールド

datetime_fields

publish_at

在庫状況などのブールフィールド

boolean_fields

in_stock

JSON フィールド

json_fields

metadata

テキストフィールドのトークナイザー選択ガイド

テキストフィールド用の正しいトークナイザーを選択することは、検索結果に直接影響します。次の表は、一般的なトークナイザータイプとそれらの適用シナリオの一覧です。

トークナイザータイプ

適用シナリオ

説明

jieba

中国語テキスト

Jieba トークナイザーに基づき、中国語のセマンティックなトークン化をサポートし、カスタム辞書も使用できます。

default

英語テキスト

スペースと句読点でテキストを分割します。英語やその他の欧米言語に適しています。

keyword

完全一致フィールド

形態素解析を行いません。フィールド値全体を 1 つの検索単位として扱います。カテゴリ、タグ、ステータスコードなどのフィールドに適しています。

ngram

きめ細かいマッチング

n-gram を使用してテキストを分割し、部分一致とあいまい検索をサポートしており、前方一致検索や部分文字列検索のシナリオに適しています。

形態素解析結果の検証

インデックスを作成した後、トークン化デバッグ機能を使用して、実際のトークン化の結果が期待どおりであることを確認することをお勧めします。次の例では、入力テキストに対する jieba トークナイザーのトークン化の結果を表示する方法を示します。

SELECT * FROM bm25.debug_tokenizer('cloud-native database', 'jieba');

増分データのクエリ

Nova BM25 は、ニアリアルタイムのクエリモードをサポートしています。新規に書き込まれたデータや更新されたデータは、短い遅延の後に検索可能になります。次のパラメーターとコマンドを使用して増分データのクエリに関する動作を制御し、データの鮮度とクエリパフォーマンスのバランスを取ることができます。

query_skip_mutable パラメーターを使用して、最新の増分データをクエリ対象に含めるかどうかを制御します。

パラメーター

説明

query_skip_mutable

デフォルト値: true。デフォルトのニアリアルタイムクエリモードを使用します。false に設定すると、最新の増分データが含まれますが、クエリレイテンシーが増加する可能性があります。

インデックス作成時にこのパラメーターを設定します。

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_mutableon に設定すると、クエリに最新の増分データが含まれるようになります。

-- 現在のセッションで増分データを含める
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

削除されたデータが占有していた領域を再利用し、テーブルのストレージを最適化します。

REINDEX

インデックスを再構築してインデックスフラグメントをクリーンアップし、クエリパフォーマンスを回復します。

DROP INDEX

使用されなくなったインデックスを削除して、ストレージ領域を解放します。

VACUUM docs;
REINDEX INDEX docs_bm25_idx;
DROP INDEX docs_bm25_idx;