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

Hologres:フルテキスト転置インデックス

最終更新日:Sep 04, 2026

Hologres V4.0 以降では、フルテキスト転置インデックスがサポートされています。この機能は、パフォーマンス専有型の全文検索エンジンである Tantivy 上に構築されています。また、BM25 類似度スコアリングアルゴリズムもサポートしており、ドキュメントランキング、キーワード検索、フレーズ検索が可能です。

仕組み

ソーステキストを Hologres に書き込むと、インデックス構成に基づいて、データファイルごとにフルテキスト転置インデックスファイルが構築されます。このプロセスは、トークナイザーがテキストをトークンに分割することから始まります。次に、インデックスは各トークンからそのソーステキストへのマッピングを、その位置と Term Frequency (TF) とともに記録します。

全文検索を実行すると、Hologres はまずクエリテキストを形態素解析して一連のクエリトークンに分割します。その後、Hologres は BM25 アルゴリズムを使用して、クエリトークンのセットに対して各ソーステキストの関連度スコアを計算します。このプロセスにより、パフォーマンス専有型かつ高精度の全文検索が可能になります。

注意事項

  • Hologres V4.0 以降では、フルテキスト転置インデックスは、列ストアテーブルと行列混在ストアテーブルでのみサポートされており、行ストアテーブルではサポートされていません。

  • フルテキスト転置インデックスは、TEXT、CHAR、または VARCHAR 型の列にのみ作成できます。

  • 列ごとに作成できるフルテキスト転置インデックスは 1 つだけです。複数の列にインデックスを作成するには、列ごとに個別のインデックスを作成します。

  • フルテキスト転置インデックスを作成した後、既存のデータおよび新しく一括ロードされたデータのインデックスファイルは、データコンパクション中に非同期で構築されます。インデックスが構築されるまで、データの BM25 関連度スコアは 0 になります。

  • リアルタイムのデータ書き込みに対するインデックス作成の動作は、バージョンによって異なります。V4.0.8 より前では、インデックスは同期的に構築されます。V4.0.8 以降では、書き込み効率を向上させるために、システムはインメモリインデックスを 1 秒ごとに非同期でリフレッシュします。リフレッシュが完了した後にのみ、インデックスを使用してデータをクエリできます。

  • 全文検索は、フルテキスト転置インデックスを持つ列に対してのみ実行できます。インデックスのない列の検索はサポートされていません。

  • 一括データインポートには、サーバーレスリソースを使用することを推奨します。これらのリソースは、インポートプロセス中にコンパクションを実行し、フルテキスト転置インデックスを同期的に構築します。詳細については、「サーバーレスコンピューティングを使用した読み取り/書き込みタスクの実行」および「サーバーレスコンピューティングを使用したコンパクションタスクの実行」をご参照ください。サーバーレスリソースを使用しない場合は、一括インポートまたはインデックス変更後に、次のコマンドで手動でコンパクションをトリガーすることを推奨します。

    VACUUM <schema_name>.<table_name>;
  • デフォルトでは、BM25 検索アルゴリズムはファイルレベルの統計情報から関連度スコアを計算します。Hologres V5.0 以降では、hg_text_search_bm25_statistics_level パラメーターを使用してシャードレベルのスコアリングに切り替えることができます。これにより、同じシャード内でスコアを比較可能になります。デフォルトのファイルレベルのスコアリングを維持し、データを小規模なバッチでインポートする場合は、必要に応じて手動でコンパクションをトリガーしてデータファイルをマージし、検索精度を向上させることを推奨します。

  • サーバーレスリソースを使用して、全文検索クエリを実行できます。

  • 次の表を使用して、シナリオに適したトークナイザーを選択してください:

    シナリオ

    トークナイザー

    説明

    長文記事からのキーワード抽出

    Jieba

    新語発見と複雑なモード切り替えをサポートします。

    中国語の記述テキストの検索

    IK

    中国語の用語を正確に識別します。

    英語のタイトルのようなテキストの検索

    Simple、Whitespace、Standard

    シンプルで効率的です。特定のテキストに基づいていずれかを選択します。

    ログのようなテキストのあいまい検索

    Ngram

    辞書不要で、あいまいなテキストクエリに適しています。

    中国語の製品名や人名の Pinyin ベースの検索

    Pinyin

    完全な Pinyin、頭文字の略語、複数の発音を持つ文字など、さまざまな中国語 Pinyin 検索シナリオをサポートします。

インデックスの管理

インデックスの作成

構文

CREATE INDEX [ IF NOT EXISTS ] idx_name ON table_name
       USING FULLTEXT (column_name [ , ... ])
       [ WITH ( storage_parameter [ = value ] [ , ... ] ) ];

パラメーター

パラメーター

説明

idx_name

インデックス名。

table_name

ターゲットテーブルの名前。

column_name

フルテキスト転置インデックスの対象となる列。

storage_parameter

フルテキスト転置インデックスのパラメーターを指定します。次のパラメーターがサポートされています:

  • tokenizer:トークナイザーの名前。次のトークナイザーがサポートされています:

    • jieba (V4.1 以前のデフォルト):ルールベースのマッチングと統計モデルを組み合わせた中国語トークナイザーです。

    • whitespace:テキストを空白で分割するトークナイザーです。

    • standard:Unicode 標準附属書 #29 のセグメンテーションルールに基づくトークナイザーです。

    • simple:テキストを空白と句読点で分割するトークナイザーです。

    • keyword:入力フィールド全体を単一のトークンとして出力するトークナイザーです。

    • icu:多言語テキスト処理用のトークナイザーです。

    • ik (V4.2 以降のデフォルト):IK Analyzer に基づく中国語トークナイザーです。英語の単語、メールアドレス、URL (:// なし)、IP アドレスなどの特殊なフォーマットを自動的に認識します。Hologres V4.0.9 以降でサポートされています。

    • ngram:テキストを n-gram (n 文字の隣接したシーケンス) に分割する文字ベースのスライドウィンドウ トークナイザーです。再現率とあいまい一致機能を向上させ、LIKE および ILIKE クエリの高速化に適しています。Hologres V4.0.9 以降でサポートされています。

    • pinyin:Pinyin トークナイザーです。中国語の文字や単語の Pinyin を生成し、非中国語の文字列の Pinyin 分割を導出できます。これにより、より正確な Pinyin 生成と高い検索再現率が可能になります。Hologres V4.0.9 以降でサポートされています。

  • analyzer_params:トークナイザーの構成で、JSON 形式の文字列として指定します。

    • 各トークナイザーにはデフォルトの analyzer_params 構成があります。ほとんどの場合、tokenizer パラメーターのみを指定し、analyzer_params を省略することで、デフォルト設定を使用できます。

    • これらの設定の一部はカスタマイズできます。詳細については、「高度な操作:トークナイザー構成のカスタマイズ」をご参照ください。

  • index_options:インデックスに保存する詳細レベルを指定します。これは、必要なストレージとサポートされる機能に影響します。Hologres V4.1.9 以降でサポートされています。詳細については、以下の「index_options の構成」をご参照ください。

説明

各インデックスは、1 つの tokenizer と 1 つの analyzer_params のセットのみをサポートします。

V4.2 以降、トークナイザーを明示的に指定せずに新しく作成されたインデックスは、デフォルトで ik になります。アップグレード前に作成されたインデックスは、元のトークナイザーを保持します。

index_options の構成

index_options パラメーターは 3 つのレベルをサポートします。上位レベルのオプションは、下位レベルのすべての情報を自動的に含みます:freqs は docs のすべての情報を含み、positions は freqs と docs のすべての情報を含みます。

値

インデックスの内容

影響と制限

ユースケース

positions (デフォルト)

ドキュメント ID + Term Frequency (TF) + 位置

全機能サポート:フレーズクエリと標準の関連度スコアリングをサポートします。

一般的な全文検索シナリオ。

freqs

ドキュメント ID + Term Frequency (TF)

フレーズクエリはサポートされておらず、エラーを返します。

Term Frequency (TF) に基づくスコアリングとランキングが必要で、完全なフレーズ一致が不要なシナリオ。

docs

ドキュメント ID のみ

  • Term Frequency (TF) 情報が欠落しているため、関連度スコアリングでは Term Frequency (TF) の差が無視されます (TF スコアはすべての一致するドキュメントで同じになります)。

  • フレーズクエリはサポートされておらず、エラーを返します。

存在チェック (フィルタリング) のみが必要で、関連度スコアリングが不要な、ストレージに敏感なシナリオに最適です。

説明

keyword トークナイザーを使用するインデックスの場合、レコードレベルは docs に固定され、index_options 設定は適用されません。

例

  • デフォルトのトークナイザーと構成 (jieba (V4.1 以前)、ik (V4.2 以降)) でフルテキスト転置インデックスを作成します。

    CREATE INDEX idx1 ON tbl 
           USING FULLTEXT (col1);
  • ik トークナイザーを明示的に指定し、そのデフォルト構成を使用します。

    CREATE INDEX idx1 ON tbl 
           USING FULLTEXT (col1)
           WITH (tokenizer = 'ik');
  • カスタムトークナイザー構成を明示的に指定します:exact モードの jieba トークナイザーで、lowercase フィルターのみを使用します。

    CREATE INDEX idx1 ON tbl 
           USING FULLTEXT (col1)
           WITH (tokenizer = 'jieba',
                 analyzer_params = '{"tokenizer":{"type":"jieba","mode":"exact"}, "filter":["lowercase"]}');
  • インデックス作成時に index_options を freqs に設定します。これによりスペースを節約できますが、フレーズクエリはサポートされません。Hologres V4.1.9 以降でサポートされています。

    CREATE INDEX idx1 ON tbl
           USING FULLTEXT (col1)
           WITH (index_options = 'freqs');
説明

インデックスの変更

構文

-- インデックス構成の変更
ALTER INDEX [ IF EXISTS ] <idx_name> SET ( <storage_parameter> = '<storage_value>' [ , ... ] );

-- デフォルト構成へのリセット
ALTER INDEX [ IF EXISTS ] <idx_name> RESET ( <storage_parameter> [ , ... ] );

パラメーター

パラメーターの詳細な説明については、「パラメーター」をご参照ください。

例

説明

フルテキスト転置インデックスを変更した後、コンパクションによってインデックスファイルが非同期で構築されます。インデックス変更後に VACUUM <schema_name>.<table_name>; コマンドを実行して、手動でコンパクションをトリガーすることを推奨します。詳細については、「コンパクション」をご参照ください。

  • インデックスのトークナイザーを standard に変更します。

    ALTER INDEX idx1 SET (tokenizer = 'standard');
  • インデックスのトークナイザーを ik_max_word モードの ik に変更し、小文字への変換を行わず、フィルターも使用しません。

    ALTER INDEX idx1 SET (
      tokenizer = 'ik',
      analyzer_params = '{"tokenizer":{"type":"ik","mode":"ik_max_word","enable_lowercase": false}}'
    );
  • デフォルトの jieba トークナイザーにリセットし、そのデフォルトの analyzer_params 構成を使用します。

    ALTER INDEX idx1 RESET (tokenizer);
    ALTER INDEX idx1 RESET (tokenizer, analyzer_params);
  • 現在のトークナイザーのデフォルトの analyzer_params 構成にリセットします。

    ALTER INDEX idx1 RESET (analyzer_params);
  • インデックスの index_options を docs に変更します。

    ALTER INDEX idx1 SET (index_options = 'docs');
  • index_options をデフォルト値の positions にリセットします。

    ALTER INDEX idx1 RESET (index_options);

インデックスの削除

構文

DROP INDEX [ IF EXISTS ] <idx_name> [ RESTRICT ];

パラメーター

パラメーターの詳細な説明については、「パラメーター」をご参照ください。

インデックスの表示

Hologres は hologres.hg_index_properties システムテーブルを提供しており、テーブルに作成されたフルテキスト転置インデックスとそれに対応する位置を表示できます。

SELECT * FROM hologres.hg_index_properties;

次の SQL ステートメントを実行して、インデックスに関連付けられたテーブルと列を表示します。

SELECT 
    t.relname AS table_name, 
    a.attname AS column_name
FROM pg_class t
    JOIN pg_index i ON t.oid = i.indrelid
    JOIN pg_class idx ON i.indexrelid = idx.oid
    JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(i.indkey)
WHERE t.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = '<namespace>')
    AND idx.relname = '<indexname>'
LIMIT 1;

パラメーター:

  • namespace:SELECT * FROM hologres.hg_index_properties; コマンドの出力における table_namespace フィールドの値。

  • indexname:インデックスの実際の名前。

インデックス構築の進捗の表示

フルテキスト転置インデックスを作成した後、ビルトイン関数 hg_show_build_index_progress を使用して、インデックスの構築の進捗をリアルタイムで表示できます。この関数は、指定されたテーブル上のすべてのフルテキストインデックスの構築ステータスを返します。

例

SELECT * FROM hg_show_build_index_progress('<table_name>');

使用上の注意

  • この関数を呼び出すには、指定されたテーブルに対する SELECT 権限が必要です。

  • この関数は、構築されたファイル数、総ファイル数、パーセント単位の構築の進捗、推定残り時間など、テーブル上のすべてのフルテキストインデックスの構築情報を返します。

戻り値

結果には次のフィールドが含まれます:

フィールド

データ型

説明

schema_name

TEXT

インデックスを含むスキーマの名前。

table_name

TEXT

テーブルの名前。

index_name

TEXT

インデックスの名前。

index_id

BIGINT

インデックスの一意の ID。

am_name

TEXT

インデックスのタイプ。

built_index_size

TEXT

構築されたインデックスのサイズ。

built_num_files

INTEGER

インデックス構築が完了したファイルの数。

target_num_files

INTEGER

インデックスを構築する必要があるファイルの総数。

progress

TEXT

構築の進捗 (パーセンテージ)。

estimated_remaining_time

TEXT

推定残り構築時間。

インデックスを使用した全文検索

Hologres はさまざまな検索モードをサポートしており、ビジネスロジックに合わせて全文検索を調整できます。

検索モード

説明

キーワード一致

形態素解析された検索オブジェクト内のキーワードを検索します。AND/OR ロジックを使用してキーワード間の関係を定義できます。

フレーズ検索

完全なフレーズを検索します。一致するには、フレーズ内の単語が指定された距離内に現れる必要があります。

自然言語検索

自然言語構文を使用して複雑なクエリ条件を定義できます。これには、AND/OR ロジック、必須の term、除外する term、およびフレーズの指定が含まれます。

用語検索

検索オブジェクトの完全一致を実行します。一致を返すには、インデックスに完全なクエリ文字列が含まれている必要があります。

TEXT_SEARCH 関数

TEXT_SEARCH 関数は、検索オブジェクトに基づいて検索ソースの BM25 関連度スコアを計算します。

関数構文

TEXT_SEARCH (
  <search_data> TEXT/VARCHAR/CHAR
  ,<search_expression> TEXT
  [ ,<mode> TEXT DEFAULT 'match'
  ,<operator> TEXT DEFAULT 'OR'
  ,<tokenizer> TEXT DEFAULT ''
  ,<analyzer_params> TEXT DEFAULT ''
  ,<options> TEXT DEFAULT '']
)

パラメーター

パラメーター

必須

説明

search_data

はい

検索ソース。サポートされているデータ型は TEXT、VARCHAR、および CHAR です。このパラメーターは、フルテキストインデックスを持つ列でなければなりません。そうでない場合、エラーが返されます。

search_expression

はい

検索オブジェクト。サポートされているデータ型は TEXT、VARCHAR、および CHAR です。このパラメーターは定数でなければなりません。

mode

いいえ

検索モード。次のモードがサポートされています:

  • match (デフォルト):キーワード一致。形態素解析によって生成された各トークンはキーワードとして扱われます。operator パラメーターはキーワード間の関係を定義し、デフォルトは OR です。

  • phrase:フレーズ検索。options の slop パラメーターは、フレーズ内の単語間の最大距離を構成します。デフォルト値は 0 で、単語が隣接している必要があることを意味します。フレーズ検索はあいまいクエリをサポートしていません。

  • natural_language:自然言語検索。このモードは、AND/OR ロジック、必須の term、除外する term、フレーズなどの複雑なクエリ条件をサポートします。詳細については、「Tantivy」をご参照ください。

  • term:完全一致検索。search_expression は形態素解析されたり、その他の処理をされたりしません。関数はインデックス内で完全一致を実行します。完全一致検索はあいまいクエリをサポートしていません。

  • fuzzy:あいまい検索。編集距離に基づいて search_expression のあいまい一致を実行します。Hologres V4.2 以降でサポートされています。

operator

いいえ

キーワード間に使用する論理演算子を指定します。このパラメーターは、mode が match に設定されている場合にのみ有効です。次の値がサポートされています:

  • OR (デフォルト):検索オブジェクトに複数のトークンが含まれている場合、いずれかのトークンが見つかれば一致を返します。

  • AND:検索オブジェクトに複数のトークンが含まれている場合、すべてのトークンが見つかった場合にのみ一致を返します。

tokenizer、analyzer_params

いいえ

search_expression のトークナイザーとその構成を指定します。ほとんどの場合、これらのパラメーターを構成する必要はありません。

  • 指定しない場合、関数は search_data 列のフルテキスト転置インデックスと同じトークナイザーと構成を使用します。検索ソースが定数の場合、デフォルトのトークナイザー (jieba) が使用されます。

  • 指定した場合、関数は指定されたトークナイザーと構成を使用して search_expression を形態素解析します。

options

いいえ

全文検索のその他のパラメーター。入力パラメーターのフォーマットは 'key1=v1;key2=v2;....;keyN=vN;' です。次のオプションがサポートされています:

  • slop:mode が phrase の場合にのみ有効です。0 (デフォルト) または正の整数を指定でき、フレーズ内の単語間に許容される最大距離を定義します。

  • fuzziness:mode が match、natural_language、または fuzzy の場合にのみ有効です。あいまい一致の最大編集距離 (文字の挿入、削除、または置換の総数) を指定します。サポートされている値は次のとおりです:

    • 0 (デフォルト):あいまい一致を無効にします。検索文字列は完全に一致する必要があります。

    • 1 または 2:1 または 2 の編集距離が許容されます。

    • AUTO:編集距離は検索文字列の長さに応じて自動的に選択されます。デフォルトのルールは:長さ <3 → 0、長さ 3–5 → 1、長さ >5 → 2 です。

    • AUTO:<low>,<high>:AUTO のしきい値をカスタマイズします。例えば、AUTO:3,5 は:長さ <3 → 0、長さ 3–5 → 1、長さ ≥6 → 2 を意味します。

  • fuzzy_max_expansions:mode が match、natural_language、または fuzzy の場合にのみ有効です。あいまい一致中に生成される候補 term の最大数を指定します。デフォルト値は 50 です。値を大きくすると再現率が向上しますが、クエリのオーバーヘッドが増加します。

  • fuzzy_transpositions:mode が match、natural_language、または fuzzy の場合にのみ有効です。2 つの隣接する文字の転置を 1 回の編集として扱うかどうかを指定します。デフォルト値は true です。

  • minimum_should_match:mode が match または natural_language の場合にのみ有効です。検索オブジェクトから生成されたトークンのうち、ドキュメントが返されるために含まなければならないトークンの数を指定します。このオプションは結果セットをフィルタリングするだけで、BM25 スコアには影響しません。Hologres V5.0 以降でサポートされています。次のフォーマットがサポートされています:

    • 正の整数:一致しなければならないトークンの最小数。例えば、2 は少なくとも 2 つのトークンが一致することを要求します。

    • 負の整数:欠落してもよいトークンの最大数。例えば、-1 は最大 1 つのトークンの欠落を許容します。

    • 正のパーセンテージ:一致するトークンの最小数で、トークン数の割合として計算され、切り捨てられます。例えば、検索オブジェクトが 5 つのトークンを生成する場合、75% は少なくとも floor(5 × 0.75) = 3 つのトークンが一致することを要求します。

    • 負のパーセンテージ:欠落してもよいトークンの最大数で、トークン数の割合として計算され、切り捨てられます。例えば、検索オブジェクトが 5 つのトークンを生成する場合、-25% は最大 floor(5 × 0.25) = 1 つのトークンの欠落を許容します。これは、少なくとも 4 つのトークンが一致しなければならないことを意味します。

    • 条件付き指定:token_count<spec のフォーマットを使用します。条件の後の指定は、検索オブジェクトから生成されたトークンの数が指定された数を超えた場合に適用されます。例えば、3<-25% は、トークン数が 3 以下の場合はすべてのトークンが一致することを要求し、トークン数が 3 を超える場合は -25% を適用します。

    • 複数の条件付き指定:条件を 1 つのスペースで区切ります。Hologres は、満たされる最初の条件を適用します。例えば、3<2 5<-1 は、トークン数が 3 以下の場合はすべてのトークンが一致することを要求し、トークン数が 3 を超え 5 以下の場合は 2 を適用し、トークン数が 5 を超える場合は -1 を適用します。

    • natural_language モードでは、このオプションはクエリ文字列がブール組み合わせクエリに解析された場合にのみ有効です。クエリ文字列が二重引用符で囲まれた "shandong university" のようなフレーズクエリに解析された場合、Hologres はこのオプションを黙って無視し、フレーズ一致を実行します。

    • このオプションは、should セマンティクスを持つクエリにのみ適用されます。クエリに should セマンティクスがないのは、mode が match で operator が AND の場合、または mode が natural_language で、すべての要素が + または - 演算子によって制約される場合です。これらの場合、minimum_should_match の値が 0 より大きいと、空の結果セットが返されます。

説明

slop パラメーターは、フレーズ内の単語間に許容される最大の間隔 (または変換コスト) を表します。jieba、keyword、icu のようなトークナイザーの場合、距離の単位はトークン数ではなく文字数です。standard、simple、whitespace のようなトークナイザーの場合、単位はトークン数です。

戻り値

検索ソースと検索オブジェクト間の BM25 関連度スコアを表す非負の FLOAT 値を返します。スコアが高いほど関連性が高いことを示します。テキストが完全に関連しない場合、スコアは 0 です。

例

  • キーワード一致モードを使用し、演算子を AND に変更します。

    -- パラメーター名を指定することを推奨します。
    SELECT TEXT_SEARCH (content, 'machine learning', operator => 'AND') FROM tbl;
    
    -- パラメーター名を指定しない場合は、正しい順序で指定する必要があります。
    SELECT TEXT_SEARCH (content, 'machine learning', 'match', 'AND') FROM tbl;
  • フレーズ検索モードを使用し、slop を 2 に設定します。

    SELECT TEXT_SEARCH (content, 'machine learning', 'phrase', options => 'slop=2;') FROM tbl;
  • 自然言語検索モードを使用します。

    -- AND および OR 演算子を使用して、トークンの検索ロジックを定義します。
    SELECT TEXT_SEARCH (content, 'machine AND (system OR recognition)', 'natural_language') FROM tbl;
    
     -- + (必須の term) および - (除外する term) を使用して、トークンの検索ロジックを定義します。
    SELECT TEXT_SEARCH (content, '+learning -machine system', 'natural_language') FROM tbl;
  • term 検索モードを使用します。

    SELECT TEXT_SEARCH (content, 'machine learning', 'term') FROM tbl;
  • fuzziness を 1 に設定したあいまい検索モードを使用します。

    SELECT TEXT_SEARCH (content, 'machine learning', 'fuzzy', options => 'fuzziness=1;') FROM tbl;

TOKENIZE 関数

TOKENIZE 関数は、トークナイザーの構成に基づいて形態素解析の結果を返します。この関数を使用して、全文転置インデックスの形態素解析をデバッグできます。

関数構文

TOKENIZE (
  <search_data> TEXT
  [ ,<tokenizer> TEXT DEFAULT ''
  ,<analyzer_params> TEXT DEFAULT '']
)

パラメーター

  • search_data:必須。形態素解析するターゲットテキスト。このパラメーターは定数でなければなりません。

  • tokenizer、analyzer_params:オプション。search_data テキストのトークナイザーとその構成を指定します。デフォルトのトークナイザーは、V4.1 以前では jieba、V4.2 以降では ik です。

戻り値

ターゲットテキストからのトークンを含む TEXT 配列を返します。

インデックス使用の確認

実行計画をチェックして、SQL クエリがフルテキスト転置インデックスを使用しているかどうかを確認できます。計画に Fulltext Filter が存在する場合、インデックスが正常に使用されていることを示します。実行計画の詳細については、「EXPLAIN と EXPLAIN ANALYZE」をご参照ください。

SQL の例:

EXPLAIN ANALYZE SELECT * FROM wiki_articles WHERE text_search(content, 'Yangtze River') > 0;

実行計画は次のとおりです。Fulltext Filter フィールドが含まれており、SQL ステートメントがフルテキスト転置インデックスを正常に使用したことを示しています。

QUERY PLAN
Gather  (cost=0.00..1.00 rows=1 width=12)
  ->  Local Gather  (cost=0.00..1.00 rows=1 width=12)
        ->  Index Scan using Clustering_index on wiki_articles  (cost=0.00..1.00 rows=1 width=12)
              Fulltext Filter: (text_search(content, search_expression => 'Yangtze River'::text, mode => match, operator => OR, tokenizer => jieba, analyzer_params => {"filter":["removepunct","lowercase",{"stop_words":["_english_"],"type":"stop"},{"language":"english","type":"stemmer"}],"tokenizer":{"hmm":true,"mode":"search","type":"jieba"}}, options => ) > '0'::double precision)
Query Queue: init_warehouse.default_queue
Optimizer: HQO version 4.0.0

推奨事項

サーバーレスリソースを使用したインデックスの再構築

一部のプロパティ変更はコンパクションとインデックスの再構築をトリガーし、CPU 使用率が急上昇する可能性があります。これらの変更は次のように処理してください:

`bitmap_columns`、`dictionary_encoding_columns`、またはベクターインデックスの変更

ALTER TABLE ... SET の代わりに、サーバーレスコンピューティングリソースで REBUILD 構文を使用します。詳細については、「REBUILD」をご参照ください。

ASYNC REBUILD TABLE <table_name>
WITH (
    rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
    bitmap_columns = '<col1>,<col2>',
    dictionary_encoding_columns = '<col1>:on,<col2>:off',
    vectors = '{
    "<col_vector>": {
        "algorithm": "HGraph",
        "distance_method": "Cosine",
        "builder_params": {
            "base_quantization_type": "rabitq",
            "graph_storage_type": "compressed",
            "max_degree": 64,
            "ef_construction": 400,
            "precise_quantization_type": "fp32",
            "use_reorder": true,
            "max_total_size_to_merge_mb": 4096
        }
    }
    }'
);

JSON データまたはフルテキストインデックス列の列ストレージの変更

REBUILD 構文は、これらの変更にはまだサポートされていません。代わりに一時テーブルを使用してください:

BEGIN;
-- 既存の一時テーブルをクリーンアップ
DROP TABLE IF EXISTS <table_new>;
-- 同じ構造で一時テーブルを作成
SET hg_experimental_enable_create_table_like_properties = on;
CALL HG_CREATE_TABLE_LIKE ('<table_new>', 'select * from <table>');
COMMIT;

-- 新しい列プロパティを一時テーブルに適用
ALTER TABLE <table_new> ALTER COLUMN <column_name> SET (enable_columnar_type = ON);
CREATE INDEX <idx_name> ON <table_new> USING FULLTEXT (column_name);

-- サーバーレスリソースを使用してデータを挿入 (インデックス構築は同期的に完了)
SET hg_computing_resource = 'serverless';
INSERT INTO <table_new> SELECT * FROM <table>;
ANALYZE <table_new>;

BEGIN;
-- 元のテーブルを一時テーブルに置き換え
DROP TABLE IF EXISTS <table>;
ALTER TABLE <table_new> RENAME TO <table>;
COMMIT;

その他のプロパティ変更 (例:`distribution_key`、`clustering_key`、`segment_key`、ストレージフォーマット)

サーバーレスコンピューティングリソースで REBUILD 構文を使用します。

高度な操作:トークナイザー構成のカスタマイズ

Hologres は、デフォルトのトークナイザー構成を使用することを推奨します。ただし、フルテキスト転置インデックスのデフォルト構成がニーズを満たさない場合は、トークナイザーをカスタマイズして、より柔軟な形態素解析を行うことができます。

analyzer_params の要件

analyzer_params パラメーターは、次の要件を満たす必要があります:

  • JSON 文字列である必要があります。

  • トップレベルの JSON オブジェクトは、tokenizer と filter の 2 つのキーをサポートします。これらは次のように構成されます:

    • filter:オプション。フィルターを構成するために使用される JSON 配列。複数のフィルターは指定された順序で適用されます。

    • tokenizer:必須。トークナイザーのプロパティを構成する JSON オブジェクト。この JSON オブジェクトは次のキーをサポートします:

      • type:必須。トークナイザーの名前。

      • tokenizer オブジェクトのパラメーターは、トークナイザーによって異なります。詳細については、次の表をご参照ください:

        トークナイザー

        パラメーター


        説明

        値

        jieba

        mode

        形態素解析モード。

        • search (デフォルト):冗長性を許容し、複数の可能なトークンの組み合わせをリストアップします。

        • exact:冗長な分割を行いません。

        hmm

        隠れマルコフモデルを使用して辞書にない単語を識別するかどうかを決定します。この機能は新語の識別を向上させます。

        • true (デフォルト):モデルを使用します。

        • false:モデルを使用しません。

        standard

        max_token_length

        最大トークン長。

        正の整数。デフォルト値は 255 です。トークンがこの長さを超えると、max_token_length の間隔で分割されます。

        ik

        mode

        形態素解析モード。

        • ik_max_word (デフォルト):すべての可能な短い単語を出力する、きめ細かい形態素解析。

        • ik_smart:トークン数を減らすために長い単語を優先する、粗い粒度の形態素解析モード。出力トークンは重複しません。このモードは、数字と助数詞を単一のトークンに結合しようとします。

        enable_lowercase

        トークンを小文字に変換するかどうかを決定します。

        • true (デフォルト)

        • false

        ngram

        min_ngram

        トークンの最小文字長。

        正の数。デフォルトは 1 です。max_ngram との最大許容差は 3 です。

        注:次の GUC を設定することで、最大差を調整できます。例:SET hg_fulltext_index_max_ngram_diff = 5;

        max_ngram

        トークンの最大文字長。

        正の数。デフォルトは 2 です。値は [1, 255] の範囲内である必要があります。min_ngram との最大許容差は 3 です。

        説明

        max_ngram と min_ngram の差が大きいと、ngram トークナイザーが多くのトークンを生成し、リソース消費、ストレージ、インデックス構築時間が増加します。

        prefix_only

        プレフィックス n-gram のみを生成するかどうかを決定します。

        • true

        • false (デフォルト)

        pinyin

        keep_first_letter

        各漢字の最初の文字を保持するかどうかを決定します。

        • true (デフォルト):pinyin の頭文字を保持します。

        • false:最初の文字を保持しません。

        keep_separate_first_letter

        各漢字の最初の文字を別のトークンとして保持するかどうかを決定します。

        • true:各文字の頭文字を保持します。

        • false (デフォルト):別のトークンとして保持しません。

        limit_first_letter_length

        結合された最初の文字を含むトークンの最大長。

        整数。デフォルト値は 16 です。

        keep_full_pinyin

        各漢字の完全な Pinyin を保持するかどうかを決定します。

        • true (デフォルト):pinyin が保持されます。

        • false:完全な Pinyin を保持しません。

        keep_joined_full_pinyin

        各漢字の完全な Pinyin を単一のトークンに結合するかどうかを決定します。

        • true:連結を有効にします。

        • false (デフォルト):Pinyin を結合しません。

        keep_none_chinese

        結果に非中国語の文字や数字を保持するかどうかを決定します。

        • true (デフォルト):保持します。

        • false:保持しません。

        keep_none_chinese_together

        連続する非中国語の文字や数字を単一のトークンとして一緒に保持するかどうかを決定します。

        • true (デフォルト):文字と数字のシーケンスを一緒に保持します。

        • false:元の形式を保持しません。

        説明

        このパラメーターは、keep_none_chinese が true に設定されている場合にのみ有効です。

        keep_none_chinese_in_first_letter

        最初の文字のトークンに非中国語の文字や数字を保持するかどうかを決定します。

        • true (デフォルト):トークンを保持します。

        • false:保持しません。

        keep_none_chinese_in_joined_full_pinyin

        結合された完全な Pinyin トークンに非中国語の文字や数字を保持するかどうかを決定します。

        • true:トークンを保持します。

        • false (デフォルト):保持しません。

        none_chinese_pinyin_tokenize

        非中国語の文字が有効な Pinyin を形成する場合に、それらを別々の Pinyin term に分割するかどうかを決定します。

        • true (デフォルト):分割します。

        • false:分割しません。

        説明

        このパラメーターは、keep_none_chinese と keep_none_chinese_together が true に設定されている場合にのみ有効です。

        keep_original

        元の入力を保持するかどうかを決定します。

        • true:元の入力を保持します。

        • false (デフォルト):元の入力を保持しません。

        lowercase

        非中国語の文字を小文字に変換するかどうかを決定します。

        • true (デフォルト)

        • false

        trim_whitespace

        空白文字をトリミングするかどうかを決定します。

        • true (デフォルト)

        • false

        remove_duplicated_term

        重複する term を削除するかどうかを決定します。

        • true:ストップワードを削除します。

        • false (デフォルト):重複を削除しません。

        keep_separate_chinese

        個々の漢字を別のトークンとして保持するかどうかを決定します。

        • true:文字を保持します。

        • false (デフォルト):保持しません。

デフォルトの analyzer_params

次の表は、異なるトークナイザーのデフォルトの analyzer_params 構成を示しています。

トークナイザー

デフォルトの analyzer_params

jieba (V4.1 以前のデフォルトトークナイザー)

{
  "tokenizer": {
    "type": "jieba", 
    "mode": "search",
    "hmm": true
  }, 
  "filter": [
    "removepunct",
    "lowercase",
    {"type": "stop", "stop_words": ["_english_"]},
    {"type": "stemmer", "language": "english"}
  ]
}

whitespace

{
  "tokenizer": {
    "type": "whitespace"
  }
}

keyword

{
  "tokenizer": {
    "type": "keyword"
  }
}

simple

{
  "tokenizer": {
    "type": "simple"
  }, 
  "filter": [
    "lowercase"
  ]
}

standard

{
  "tokenizer": {
    "type": "standard",
    "max_token_length": 255
  }, 
  "filter": [
    "lowercase"
  ]
}

icu

{
  "tokenizer": {
    "type": "icu"
  }, 
  "filter": [
    "removepunct",
    "lowercase"
  ]
}

ik (V4.2 以降のデフォルトトークナイザー)

{
  "tokenizer": {
    "type": "ik",
    "mode": "ik_max_word",
    "enable_lowercase": true
  },
  "filter": [
    {"type": "stop", "stop_words": ["_english_"]},
    {"type": "stemmer", "language": "english"}
  ]
}

ngram

{
  "tokenizer": {
    "type": "ngram",
    "min_gram": 1,
    "max_gram": 2,
    "prefix_only": false
  }
}

pinyin

{
  "tokenizer": {
    "type": "pinyin",
    "keep_first_letter": true,
    "keep_separate_first_letter": false,
    "keep_full_pinyin": true,
    "keep_joined_full_pinyin": false,
    "keep_none_chinese": true,
    "keep_none_chinese_together": true,
    "none_chinese_pinyin_tokenize": true,
    "keep_original": false,
    "limit_first_letter_length": 16,
    "lowercase": true,
    "trim_whitespace": true,
    "keep_none_chinese_in_first_letter": true,
    "keep_none_chinese_in_joined_full_pinyin": false,
    "remove_duplicated_term": false,
    "ignore_pinyin_offset": true,
    "fixed_pinyin_offset": false,
    "keep_separate_chinese": false
  }
}

filter の構成

Hologres は、analyzer_params で次のフィルターをサポートしています。

説明

複数のフィルターは指定された順序で適用されます。

フィルター

説明

パラメーターフォーマット

使用例

lowercase

トークン内の大文字を小文字に変換します。

フィルター名を文字列として使用します。

"lowercase"
  • フィルター定義

    "filter": ["lowercase"]
  • フィルター結果

    ["Hello", "WORLD"] -> ["hello", "world"]

stop

ストップワードトークンを削除します。


stop_words:ストップワードのリスト。リストには文字列のみを含める必要があります。カスタムリストを提供するか、特定の言語の次の組み込み辞書のいずれかを使用できます:

"_english_"
"_danish_"
"_dutch_"
"_finnish_"
"_french_"
"_german_"
"_hungarian_"
"_italian_"
"_norwegian_"
"_portuguese_"
"_russian_"
"_spanish_"
"_swedish_"
  • フィルター定義

    "filter": [{
      "type": "stop",
      "stop_words": ["_english_", "cat"]
    }]
  • フィルター結果

    ["the", "cat", "is", "on", "a", "mat"] -> ["mat"]

    説明

    単語 "cat" はカスタムストップワードです。"the"、"is"、"on"、"a" は組み込みの _english_ 辞書からのものです。

stemmer

指定された言語の文法規則に基づいて、トークンをその語幹に変換します。

language:言語。次の組み込み言語がサポートされています。

"arabic",
"danish",
"dutch",
"english",
"finnish",
"french",
"german",
"greek",
"hungarian",
"italian",
"norwegian",
"portuguese",
"romanian",
"russian",
"spanish",
"swedish",
"tamil",
"turkish"
  • フィルター定義

    "filter": [{
      "type": "stemmer",
      "language": "english"
    }]
  • フィルター結果

    ["machine", "learning"] -> ["machin", "learn"]

length

指定された長さを超えるトークンを削除します。

max:最大長。値は正の整数でなければなりません。

{"type": "length", "max": 10}
  • フィルター定義

    "filter": [{"type": "length", "max": 10}]
  • フィルター結果

    ["AI", "for", "Artificial", "Intelligence"] -> ["AI", "for", "Artificial"]

removepunct

句読文字のみで構成されるトークンを削除します。

フィルター名を文字列として使用します。

"removepunct"
説明

V4.0.8 以降、removepunct は削除モードを定義する mode パラメーターをサポートします。有効な値は次のとおりです:

  • if_all (デフォルト):すべての文字が句読文字である場合にのみトークンを削除します。

  • if_any:句読文字が含まれている場合にトークンを削除します。

  • フィルター定義

    "filter": ["removepunct"]
    説明

    これは "filter": [{"type": "removepunct", "mode": "if_all"}] と同等です。

  • フィルター結果

    ["Chinese", "english", "Chinese.", "english.", "124", "124!=8", ".", ",", ",,", " ..."]->["Chinese", "english", "Chinese.", "english.", "124", "124!=8"]

    "filter": [{"type": "removepunct", "mode": "if_any"}]

    ["Chinese", "english", "Chinese.", "english.", "124", "124!=8", ".", ",", ",,", " ..."] -> ["Chinese", "english", "124"]

pinyin

Pinyin 固有のトークンフィルタリングを提供します。

{
  "type": "pinyin",
  "keep_first_letter": true,
  "keep_separate_first_letter": false,
  "keep_full_pinyin": true,
  "keep_joined_full_pinyin": false,
  "keep_none_chinese": true,
  "keep_none_chinese_together": true,
  "none_chinese_pinyin_tokenize": true,
  "keep_original": false,
  "limit_first_letter_length": 16,
  "lowercase": true,
  "trim_whitespace": true,
  "keep_none_chinese_in_first_letter": true,
  "keep_none_chinese_in_joined_full_pinyin": false,
  "remove_duplicated_term": false,
  "ignore_pinyin_offset": true,
  "fixed_pinyin_offset": false,
  "keep_separate_chinese": false
}

Pinyin トークナイザーと同じプロパティを使用します。