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

Hologres:全文転置インデックス

最終更新日:Jun 02, 2026

Hologres バージョン 4.0 以降では、全文転置インデックスをサポートしています。この機能は、高性能な全文検索エンジン Tantivy を基盤としており、BM25 類似度スコアリングアルゴリズムもサポートしていることで、ドキュメントランキング、キーワード検索、フレーズ検索が可能になります。

仕組み

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

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

考慮事項

  • Hologres V4.0 以降では、全文転置インデックスは列ストアテーブルとハイブリッド行列ストアテーブルでのみサポートされ、行ストアテーブルではサポートされていません。

  • 全文転置インデックスは、TEXT、CHAR、または VARCHAR 型の列にのみ作成できます。

  • 1 つの列に作成できる全文転置インデックスは 1 つだけです。複数の列にインデックスを作成するには、列ごとに個別のインデックスを作成してください。

  • 全文転置インデックスを作成すると、既存のデータと新しくバルクインポートされたデータのインデックスファイルは、データコンパクション中に非同期で構築されます。インデックスが構築されるまで、データの BM25 関連度スコアは 0 になります。

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

  • 全文検索は、全文転置インデックスを持つ列でのみ実行できます。インデックスのない列では検索できません。

  • バルクインポートには、サーバーレスリソースを使用することを推奨します。これらのリソースは、インポートプロセス中にコンパクションを実行し、全文転置インデックスを同期的に構築します。詳細については、「Use Serverless Computing to perform read and write tasks」および「Use Serverless Computing to perform Compaction tasks」をご参照ください。サーバーレスリソースを使用しない場合は、バルクインポートまたはインデックスの変更後に、次のコマンドで手動でコンパクションをトリガーしてください。

    VACUUM <schema_name>.<table_name>;
  • BM25 検索アルゴリズムは、ファイルレベルで関連度スコアを計算します。データを小さなバッチでインポートする場合、必要に応じて手動でコンパクションをトリガーしてデータファイルをマージし、検索精度を向上させることを推奨します。

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

  • シナリオに適したトークナイザーを選択するには、次の表を参考にしてください:

    シナリオ

    トークナイザー

    説明

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

    Jieba

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

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

    IK

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

    英語のタイトル風テキストの検索

    Simple、Whitespace、Standard

    シンプルで効率的です。特定のテキストに基づいて選択してください。

    ログ風テキストのあいまい検索

    Ngram

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

    中国語の製品名または人名のピンイン検索

    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 (デフォルト):ルールベースのマッチングと統計モデルを組み合わせた中国語トークナイザー。

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

    • standard:Unicode Standard Annex #29 のセグメンテーションルールに基づくトークナイザー。

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

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

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

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

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

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

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

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

    • これらの設定の一部はカスタマイズできます。詳細については、「Advanced operations: Customize tokenizer configurations」をご参照ください。

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

説明

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

index_options 構成

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

インデックスの内容

影響と制限

使用例

positions (デフォルト)

ドキュメント ID + 用語頻度 + 位置

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

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

freqs

ドキュメント ID + 用語頻度

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

用語頻度に基づくスコアリングとランキングが必要だが、正確なフレーズマッチングは不要なシナリオ。

docs

ドキュメント ID のみ

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

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

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

説明

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

  • デフォルトのトークナイザーと構成 (jieba トークナイザー) で全文転置インデックスを作成します。

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

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

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

    CREATE INDEX idx1 ON tbl
           USING FULLTEXT (col1)
           WITH (index_options = 'freqs');
説明
  • 全文転置インデックスを作成すると、データインポート後にコンパクションによってインデックスファイルが構築されます。

  • バッチインポートを実行する際は、サーバーレスコンピューティングリソースの使用を推奨します。これらのリソースは、データインポート中にコンパクションを完了し、全文転置インデックスを同期的に構築します。詳細については、「Use serverless computing to perform read and write tasks」および「Use serverless computing to perform compaction tasks」をご参照ください。

  • サーバーレスリソースを使用しない場合は、バッチインポートまたはインデックス変更後に、以下のコマンドを実行して手動でコンパクションをトリガーすることを推奨します。詳細については、「Compaction (Beta)」をご参照ください。

    VACUUM <schema_name>.<table_name>;

インデックスの変更

構文

-- インデックス構成を変更
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');
  • インデックスのトークナイザーを ikik_max_word モードに変更し、小文字変換を無効にし、フィルターを適用しません。

    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, analyzer_params);
  • 現在のトークナイザーのデフォルト analyzer_params 構成にリセットします。

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

    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;

パラメーター:

  • ネームスペース: 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 ロジック、必須ターム、除外ターム、フレーズの指定が含まれます。

ターム検索

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

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

はい

検索ソース。サポートされるデータ型は TEXTVARCHARCHAR です。このパラメーターは、全文検索インデックスを持つ列である必要があります。それ以外の場合、エラーが返されます。

search_expression

はい

検索オブジェクト。サポートされるデータ型は TEXTVARCHARCHAR です。このパラメーターは定数である必要があります。

mode

いいえ

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

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

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

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

  • term:ターム検索。search_expression はトークン化やその他の処理はされません。関数はインデックス内で完全一致を実行します。ターム検索はファジークエリをサポートしていません。

  • fuzzy:ファジー検索。編集距離に基づいて search_expression のファジーマッチングを実行します。Hologres V4.2 以降でサポートされています。

operator

いいえ

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

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

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

tokenizeranalyzer_params

いいえ

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

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

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

options

いいえ

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

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

  • fuzzinessmodematchnatural_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_expansionsmodematchnatural_language、または fuzzy の場合にのみ有効です。ファジーマッチング中に生成される候補タームの最大数を指定します。デフォルト値は 50 です。値を大きくすると再現率が向上しますが、クエリのオーバーヘッドが増加します。

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

説明

slop パラメーターは、フレーズ内の単語間の最大許容間隔 (または変換コスト) を表します。jiebakeywordicu などのトークナイザーの場合、距離の単位は文字数であり、トークン数ではありません。standardsimplewhitespace などのトークナイザーの場合、単位はトークン数です。

戻り値

検索ソースと検索オブジェクト間の 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;
    
     -- + (必須ターム) と - (除外ターム) を使用して、トークンの検索ロジックを定義します。
    SELECT TEXT_SEARCH (content, '+learning -machine system', 'natural_language') FROM tbl;
  • ターム検索モードを使用します。

    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:必須。トークン化する対象テキスト。このパラメーターは定数である必要があります。

  • tokenizeranalyzer_params:オプション。search_data テキストのトークナイザーとその構成を指定します。デフォルトのトークナイザーは jieba です。

戻り値

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

インデックス使用状況の確認

実行計画を確認することで、SQL クエリが全文検索転置インデックスを使用しているかどうかを判別できます。プランに Fulltext Filter が存在する場合、インデックスが正常に使用されていることを示します。実行計画の詳細については、「EXPLAIN and EXPLAIN ANALYZE」をご参照ください。

SQL の例:

EXPLAIN ANALYZE SELECT * FROM wiki_articles WHERE text_search(content, '長江') > 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 => '長江'::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

データの準備

次の SQL 文を実行して、テストテーブルを作成し、データを挿入します。

-- テーブルを作成します
CREATE TABLE wiki_articles (id int, content text);

-- インデックスを作成します
CREATE INDEX ft_idx_1 ON wiki_articles
       USING FULLTEXT (content)
       WITH (tokenizer = 'jieba');

-- データを挿入します
INSERT INTO wiki_articles VALUES
  (1, '长江是中国第一大河,世界第三长河,全长约6,300公里。'),
  (2, 'Li was born in 1962 in Wendeng County, Shandong.'),
  (3, 'He graduated from the department of physics at Shandong University.'),
  (4, '春节,即农历新年,是中国最重要的传统节日。'),
  (5, '春节通常在公历1月下旬至2月中旬之间。春节期间的主要习俗包括贴春联、放鞭炮、吃年夜饭、拜年等。'),
  (6, '2006年,春节被国务院批准为第一批国家级非物质文化遗产。'),
  (7, 'Shandong has dozens of universities.'),
  (8, 'ShanDa is a famous university of Shandong.');

-- テーブルをコンパクションします
VACUUM wiki_articles;

-- テーブルデータをクエリします
SELECT * FROM wiki_articles limit 1;

次に結果例を示します:

id |                       content                       
---+---------------------------------------------------
 1 | 长江是中国第一大河,世界第三长河,全长约6,300公里。

クエリ例

  • キーワード一致。

    -- (K1) キーワード一致 (デフォルトの演算子 = OR)。'shandong' または 'university' のいずれかを含むドキュメントが一致します。
    SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university') > 0;
    
    -- 結果
     id |                               content                               
    ----+---------------------------------------------------------------------
      2 | Li was born in 1962 in Wendeng County, Shandong.
      3 | He graduated from the department of physics at Shandong University.
      7 | Shandong has dozens of universities.
      8 | ShanDa is a famous university of Shandong.
    
    -- (K2) キーワード一致 (演算子 = AND)。'shandong' と 'university' の両方を含むドキュメントが一致します。
    SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', operator => 'AND') > 0;
    
    -- 結果
     id |                               content
    ----+---------------------------------------------------------------------
      3 | He graduated from the department of physics at Shandong University.
      7 | Shandong has dozens of universities.
      8 | ShanDa is a famous university of Shandong.
    
    -- (K3) ファジークエリを有効にしたキーワード一致 (fuzziness = 1)。検索文字列とドキュメント内のトークンとの編集距離が 1 以内であれば一致します。
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, 'shaandong university', options => 'fuzziness=1') > 0;
  • フレーズ検索。

    -- (P1) フレーズ検索 (デフォルトのスロップ = 0)。'shandong' の直後に 'university' が続く場合にのみ一致します。
    SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', mode => 'phrase') > 0;
    
    -- 結果
     id |                               content                               
    ----+---------------------------------------------------------------------
      3 | He graduated from the department of physics at Shandong University.
    (1 row)
    
    -- (P2) スロップ = 14 のフレーズ検索。'shandong' と 'university' の間の距離が 14 文字を超えないため、このクエリは "Shandong has dozens of universities." にも一致します。
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, 'shandong university', mode => 'phrase', options => 'slop=14;') > 0;
            
    -- 結果
     id |                               content                               
    ----+---------------------------------------------------------------------
      3 | He graduated from the department of physics at Shandong University.
      7 | Shandong has dozens of universities.
    (2 rows)
    
    -- (P3) フレーズ検索は、順序が異なるフレーズにも一致できます。ただし、計算方法が異なるため、順序どおりのフレーズよりも大きいスロップ値が必要です。
    --      たとえば、このクエリは 'university of Shandong' にも一致しますが、スロップが 22 の場合は一致しません。
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, 'shandong university', mode => 'phrase', options => 'slop=23;') > 0;
            
    -- 結果   
     id |                               content                               
    ----+---------------------------------------------------------------------
      3 | He graduated from the department of physics at Shandong University.
      7 | Shandong has dozens of universities.
      8 | ShanDa is a famous university of Shandong.
    (3 rows)
    
    -- (P4) この例は、'standard' トークナイザーインデックスを使用した場合の動作を示します。
    --      standard トークナイザーでは、スロップはトークン単位で計算されます。
    --      検索ターム間のトークン数が 0 であれば、空白の数に関係なくフレーズ一致になります。
    SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', mode => 'phrase') > 0;
    
    -- 結果
     id |        content         
    ----+------------------------
      1 | shandong university
      2 | shandong  university
      3 | shandong   university
      4 | shandong    university
    (4 rows)
    
    -- (P5) 句読点は無視されます (jieba トークナイザーの例)。
    --      テキストでは "long river" と "total length" の間にカンマがあり、クエリ文字列ではピリオドを使用していても一致します。
    SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '长河。全长', mode => 'phrase') > 0;
    
    -- 結果
     id |                       content                       
    ----+-----------------------------------------------------
      1 | 长江是中国第一大河,世界第三长河,全长约6,300公里。
    (1 row)
  • 自然言語クエリ。

    -- (N1) 自然言語クエリ:特別な演算子を使用しない場合、このクエリはキーワード一致と同等です。例 (K1) と同じです。
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, 'shandong university', 'natural_language') > 0;
     id |                               content                               
    ----+---------------------------------------------------------------------
      7 | Shandong has dozens of universities.
      2 | Li was born in 1962 in Wendeng County, Shandong.
      3 | He graduated from the department of physics at Shandong University.
      8 | ShanDa is a famous university of Shandong.
    
    -- (N2) 自然言語クエリ:キーワード一致。'shandong' と 'university' の両方を含むか、'文化' を含むドキュメントに一致します。AND 演算子は OR より優先順位が高くなります。
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, '(shandong AND university) OR 文化', 'natural_language') > 0;
    -- 次と同等
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, 'shandong AND university OR 文化', 'natural_language') > 0;
    -- 次と同等
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, '(+shandong +university) 文化', 'natural_language') > 0;
    
    -- 結果
     id |                               content                               
    ----+---------------------------------------------------------------------
      8 | ShanDa is a famous university of Shandong.
      7 | Shandong has dozens of universities.
      3 | He graduated from the department of physics at Shandong University.
      6 | 2006年,春节被国务院批准为第一批国家级非物质文化遗产。
    
    -- (N3) 自然言語クエリ:キーワード一致。'shandong' を含み、'university' を含まず、'culture' を含む可能性があるドキュメントに一致します。
    --      このクエリでは、キーワード 'culture' に '+' または '-' のプレフィックスがないため、結果セットはフィルタリングされません。ただし、関連性スコアには影響します。'culture' を含む行は、より高いスコアになります。
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, '+shandong -university 文化', 'natural_language') > 0;
     id |                     content                      
    ----+--------------------------------------------------
      2 | Li was born in 1962 in Wendeng County, Shandong.
    
    -- 'shandong' を含み、'physics' を含まず、'famous' を含む可能性があるドキュメントに一致します。'famous' を含む行は、より高い関連性スコアが付けられます。
    -- 注:このクエリのスコアは 1 つのシャードで計算されます。シャード数またはファイル構成が変わると、BM25 スコアが変わる可能性があります。
    SELECT id,
           content,
           TEXT_SEARCH(content, '+shandong -physics famous', 'natural_language') as score
    FROM wiki_articles
    WHERE TEXT_SEARCH(content, '+shandong -physics famous', 'natural_language') > 0
    ORDER BY score DESC;
    
    -- 結果
     id |                     content                      |  score   
    ----+--------------------------------------------------+----------
      8 | ShanDa is a famous university of Shandong.       |  2.92376
      7 | Shandong has dozens of universities.             | 0.863399
      2 | Li was born in 1962 in Wendeng County, Shandong. | 0.716338
    
    -- (N4) 自然言語クエリ:フレーズ検索。例 (P1) と同等です。フレーズは二重引用符 ("") で囲む必要があります。フレーズに二重引用符が含まれる場合は、バックスラッシュ (\) でエスケープする必要があります。
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, '"shandong university"', 'natural_language') > 0;
            
    -- 結果
     id |                               content                               
    ----+---------------------------------------------------------------------
      3 | He graduated from the department of physics at Shandong University.
    
    -- (N5) 自然言語クエリ:フレーズ検索。例 (P3) と同等です。チルダ (~) 構文を使用してスロップを設定できます。
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, '"shandong university"~23', 'natural_language') > 0;
            
    -- 結果
     id |                               content                               
    ----+---------------------------------------------------------------------
      8 | ShanDa is a famous university of Shandong.
      7 | Shandong has dozens of universities.
      3 | He graduated from the department of physics at Shandong University.
    
    -- (N6) 自然言語クエリ:すべてのドキュメントに一致します。
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, '*', 'natural_language') > 0;
    
    -- 結果
     id |                                           content
    ----+----------------------------------------------------------------------------------------------
      1 | 长江是中国第一大河,世界第三长河,全长约6,300公里。
      2 | Li was born in 1962 in Wendeng County, Shandong.
      3 | He graduated from the department of physics at Shandong University.
      4 | 春节,即农历新年,是中国最重要的传统节日。
      5 | 春节通常在公历1月下旬至2月中旬之间。春节期间的主要习俗包括贴春联、放鞭炮、吃年夜饭、拜年等。
      6 | 2006年,春节被国务院批准为第一批国家级非物质文化遗产。
      7 | Shandong has dozens of universities.
      8 | ShanDa is a famous university of Shandong.
    
    -- (N7) ファジークエリを有効にした自然言語クエリ (fuzziness = 1)。'shaandong' は誤字ですが、必須/除外ルールと組み合わせることで、'shandong' を含むドキュメントに一致します。
    SELECT * FROM wiki_articles
            WHERE TEXT_SEARCH(content, '+shaandong -university 文化', 'natural_language', options => 'fuzziness=1') > 0;
    
    -- 結果
     id |                     content
    ----+--------------------------------------------------
      2 | Li was born in 1962 in Wendeng County, Shandong.
  • Term クエリ。

    -- (T1) Term クエリ:トークン化結果に完全一致するターム "春节" (Spring Festival) が含まれているため、このクエリは一致します。
    SELECT * FROM wiki_articles 
             WHERE TEXT_SEARCH(content, '春节', 'term') > 0;
    
    -- 結果         
     id |                                           content                                            
    ----+----------------------------------------------------------------------------------------------
      4 | 春节,即农历新年,是中国最重要的传统节日。
      5 | 春节通常在公历1月下旬至2月中旬之间。春节期间的主要习俗包括贴春联、放鞭炮、吃年夜饭、拜年等。
      6 | 2006年,春节被国务院批准为第一批国家级非物质文化遗产。
    
    
    -- (T2) Term クエリ:結果が返らない例です。
    -- 'wiki_articles' テーブルの 'content' 列では、デフォルトで jieba トークナイザーが使用されており、"shandong university" は別々のトークンに分割されます。
    -- このような完全一致のフレーズを検索する場合は、Term クエリと keyword トークナイザーを組み合わせることを推奨します。
    SELECT * FROM wiki_articles
             WHERE TEXT_SEARCH(content, 'shandong university', 'term') > 0;
    
    -- 結果
     id | content
    ----+---------
  • ファジークエリ。Hologres V4.2 以降でサポートされています。編集距離に基づき、検索文字列とドキュメントのトークンの間で、あいまい一致を実行します。

    -- (F1) ファジークエリ:'shaandong' は誤字です。ファジーモードを有効にすると、'shandong' を含むドキュメントにも一致できます。
    SELECT * FROM wiki_articles
             WHERE TEXT_SEARCH(content, 'shaandong', 'fuzzy') > 0;
    
    -- 結果
     id |                               content
    ----+---------------------------------------------------------------------
      2 | Li was born in 1962 in Wendeng County, Shandong.
      3 | He graduated from the department of physics at Shandong University.
      7 | Shandong has dozens of universities.
      8 | ShanDa is a famous university of Shandong.

複雑なクエリの例

  • 全文検索とプライマリキー条件を組み合わせます。

    -- 'shandong' または 'university' を含み、かつ id が 3 のテキストを取得します。
    SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university') > 0 and id = 3;
    
    -- 結果
     id |                               content                               
    ----+---------------------------------------------------------------------
      3 | He graduated from the department of physics at Shandong University.
      
    
    -- 'shandong' または 'university' を含むテキスト、または id が 2 未満のテキストを取得します。
    SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university') > 0 OR id < 2;
    
    -- 結果
     id |                               content                               
    ----+---------------------------------------------------------------------
      2 | Li was born in 1962 in Wendeng County, Shandong.
      8 | ShanDa is a famous university of Shandong.
      1 | 长江是中国第一大河,世界第三长河,全长约6,300公里。
      3 | He graduated from the department of physics at Shandong University.
      7 | Shandong has dozens of universities.
  • スコアの上位 3 件を返します。

    SELECT id,
           content,
           TEXT_SEARCH(content, 'shandong university') AS score,
           TOKENIZE(content, 'jieba')
      FROM wiki_articles
    ORDER BY score DESC
    LIMIT 3;
    
    -- 結果
    id  |                               content                               |  score  |                     tokenize                     
    ----+---------------------------------------------------------------------+---------+--------------------------------------------------
      8 | ShanDa is a famous university of Shandong.                          | 2.74634 | {shanda,famous,univers,shandong}
      7 | Shandong has dozens of universities.                                | 2.74634 | {shandong,has,dozen,univers}
      3 | He graduated from the department of physics at Shandong University. | 2.38178 | {he,graduat,from,depart,physic,shandong,univers}
  • SELECT リストと WHERE 句の両方で TEXT_SEARCH 関数を使用します。

    SELECT id,
           content,
           TEXT_SEARCH(content, 'shandong university') AS score,
           TOKENIZE(content, 'jieba')
      FROM wiki_articles
     WHERE TEXT_SEARCH(content, 'shandong university') > 0
    ORDER BY score DESC;
    
    -- 結果
    id  |                               content                               |  score  |                     tokenize                     
    ----+---------------------------------------------------------------------+---------+--------------------------------------------------
      7 | Shandong has dozens of universities.                                | 2.74634 | {shandong,has,dozen,univers}
      8 | ShanDa is a famous university of Shandong.                          | 2.74634 | {shanda,famous,univers,shandong}
      3 | He graduated from the department of physics at Shandong University. | 2.38178 | {he,graduat,from,depart,physic,shandong,univers}
      2 | Li was born in 1962 in Wendeng County, Shandong.                    | 1.09244 | {li,born,1962,wendeng,counti,shandong}
  • 'wiki' ソースから 'shandong university' に関する最も関連性の高いドキュメントを見つけます。

    -- JOIN 操作用のソーステーブル。
    CREATE TABLE article_source (id int primary key, source text);
    INSERT INTO article_source VALUES (1, 'baike'), (2, 'wiki'), (3, 'wiki'), (4, 'baike'),
                                      (5, 'baike'), (6, 'baike'), (7, 'wiki'), (8, 'paper'),
                                      (9, 'http_log'), (10, 'http_log'), (11, 'http_log');
                                      
    SELECT a.id,
           source, content,
           TEXT_SEARCH(content, 'shandong university') AS score,
           TOKENIZE(a.content, 'jieba')
      FROM wiki_articles a
      JOIN article_source b
        ON (a.id = b.id)
     WHERE TEXT_SEARCH(a.content, 'shandong university') > 0
       AND b.source = 'wiki'
    ORDER BY score DESC;
    
    -- 結果
    id  | source |                               content                               |  score  |                     tokenize                     
    ----+--------+---------------------------------------------------------------------+---------+--------------------------------------------------
      7 | wiki   | Shandong has dozens of universities.                                | 2.74634 | {shandong,has,dozen,univers}
      3 | wiki   | He graduated from the department of physics at Shandong University. | 2.38178 | {he,graduat,from,depart,physic,shandong,univers}
      2 | wiki   | Li was born in 1962 in Wendeng County, Shandong.                    | 1.09244 | {li,born,1962,wendeng,counti,shandong}

推奨事項

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

テーブルプロパティを変更すると、コンパクションとインデックスの再構築がトリガーされ、高い CPU 消費が発生する可能性があります。以下のテーブルプロパティを変更するには、次のように進めてください。

  • `bitmap_columns`、`dictionary_encoding_columns`、またはベクターインデックスへの変更は、コンパクションとインデックスの再作成をトリガーします。これらの変更には `ALTER TABLE xxx 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 ;

-- 対応する列に対して JSON 形式データの列指向ストレージを有効化
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 オブジェクトは、tokenizerfilter の 2 つのキーをサポートしています。設定は次のとおりです:

    • filter :省略可能。フィルターを設定するための JSON 配列です。複数のフィルターは、指定された順序で適用されます。

    • tokenizer :必須。トークナイザーのプロパティを設定する JSON オブジェクトです。この JSON オブジェクトは、以下のキーをサポートしています:

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

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

        トークナイザー

        パラメーター
































        説明

        jieba

        mode

        トークン化モード。

        • search (デフォルト) :複数の可能なトークンの組み合わせを列挙し、冗長性を許容します。たとえば、「传统节日」 (伝統的な祭り) をトークン化すると、「传统」 (伝統)、「节日」 (祭り)、「传统节日」 (伝統的な祭り) の 3 つのトークンが生成されます。

        • exact :冗長な分割を行いません。たとえば、「传统节日」は「传统节日」という単一のトークンになります。

        hmm

        辞書にない単語を識別するために隠れマルコフモデルを使用するかどうかを指定します。この機能により、新語の識別が向上します。

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

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

        standard

        max_token_length

        トークンの最大長。

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

        ik

        mode

        トークン化モード。

        • ik_max_word (デフォルト) :可能なすべての短い単語を出力する細粒度のトークン化。たとえば、「南京市」 (南京市) は「南京」 (南京) と「市」 (市) にトークン化されます。

        • ik_smart :より長い単語を優先してトークン数を減らす粗粒度のトークン化モード。出力されるトークンは重複しません。このモードでは、数字と量詞を単一のトークンに結合しようとします。たとえば、「南京市」や「1 キロメートル」などの文字列は、それ以上トークン化されません。

        enable_lowercase

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

        • true (デフォルト)

        • false

        Nグラム

        min_ngram

        トークンの最小文字長。

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

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

        max_ngram

        トークンの最大文字長。

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

        説明

        max_ngrammin_ngram の差が大きいと、Nグラムトークナイザーが多数のトークンを生成し、リソース消費、ストレージ、インデックス構築時間が増加します。

        prefix_only

        プレフィックス Nグラムのみを生成するかどうかを指定します。

        • true

        • false (デフォルト)

        pinyin

        keep_first_letter

        各漢字の頭文字を保持するかどうかを指定します。

        • true (デフォルト) :ピンインの頭文字を保持します。たとえば、「李明」のトークン化結果には「lm」が含まれます。

        • false :頭文字を保持しません。

        keep_separate_first_letter

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

        • true :各文字の頭文字を保持します。たとえば、「李明」のトークン化結果には「l」と「m」が含まれます。

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

        limit_first_letter_length

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

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

        keep_full_pinyin

        各漢字の完全なピンインを保持するかどうかを指定します。

        • true (デフォルト) :ピンインを保持します。たとえば、「李明」のトークン化結果には「li,ming」が含まれます。

        • false :完全なピンインを保持しません。

        keep_joined_full_pinyin

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

        • true :連結を有効にします。たとえば、「李明」のトークン化結果には「liming」が含まれます。

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

        keep_none_chinese

        結果に漢字以外の文字や数字を保持するかどうかを指定します。

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

        • false :保持しません。

        keep_none_chinese_together

        連続する漢字以外の文字や数字を単一のトークンとしてまとめて保持するかどうかを指定します。

        • true (デフォルト) :文字と数字のシーケンスをまとめて保持します。たとえば、「DJ Li Ming」のトークン化結果は「DJ」、「li」、「ming」となり、「DJ」は単一のトークンとして扱われます。

        • false :元の形式を保持せず、「DJ Li Ming」などの入力を「D、J、li、ming」にトークン化します。

        説明

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

        keep_none_chinese_in_first_letter

        頭文字トークンに漢字以外の文字や数字を保持するかどうかを指定します。

        • true (デフォルト) :トークンを保持します。たとえば、「李明AT2025」のトークン化結果には「lmat2025」が含まれます。

        • false :保持しません。

        keep_none_chinese_in_joined_full_pinyin

        結合された完全なピンイントークンに漢字以外の文字や数字を保持するかどうかを指定します。

        • true :トークンを保持します。たとえば、「李明AT2025」のトークン化結果には「limingat2025」が含まれます。

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

        none_chinese_pinyin_tokenize

        漢字以外の文字が有効なピンインを形成する場合、それらを個別のピンインとして分割するかどうかを指定します。

        • true (デフォルト) :分割します。たとえば、入力「limingalibaba2025」の場合、トークン化結果には「li」、「ming」、「a」、「li」、「ba」、「ba」、「2025」が含まれます。

        • false :分割しません。

        説明

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

        keep_original

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

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

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

        lowercase

        漢字以外の文字を小文字に変換するかどうかを指定します。

        • true (デフォルト)

        • false

        trim_whitespace

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

        • true (デフォルト)

        • false

        remove_duplicated_term

        重複する用語を削除するかどうかを指定します。

        • true :重複するトークンを削除します。たとえば、「de的」は「de」としてトークン化されますが、これは「de的」のフレーズクエリ結果に影響します。

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

        keep_separate_chinese

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

        • true :文字を保持します。たとえば、「李明」をトークン化すると、「李」と「明」の 2 つのトークンが生成されます。

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

analyzer_params のデフォルト設定

次の表に、さまざまなトークナイザーにおける analyzer_params のデフォルト設定を示します。

トークナイザー

analyzer_params のデフォルト設定

トークン化の例

jieba (デフォルトのトークナイザー)

{
  "tokenizer": {
    "type": "jieba", 
    "mode": "search",
    "hmm": true
  }, 
  "filter": [
    "removepunct",
    "lowercase",
    {"type": "stop", "stop_words": ["_english_"]},
    {"type": "stemmer", "language": "english"}
  ]
}
 春节
 ,
 即
 农历
 新年
 ,
 是
 中国
 最
 重要
 的
 传统
 节日
 传统节日
 。

whitespace

{
  "tokenizer": {
    "type": "whitespace"
  }
}
春节,即农历新年,是中国最重要的传统节日。

キーワード

{
  "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

{
  "tokenizer": {
    "type": "ik",
    "mode": "ik_max_word",
    "enable_lowercase": true
  },
  "filter": [
    {"type": "stop", "stop_words": ["_english_"]},
    {"type": "stemmer", "language": "english"}
  ]
}
春节
即
农历
新年
是
中国
最重
重要
的
传统节日
传统
节日

N-gram

{
  "tokenizer": {
    "type": "ngram",
    "min_gram": 1,
    "max_gram": 2,
    "prefix_only": false
  }
}
春
春节
节
节,
,
,即
即
即农
农
农历
历
历新
新
新年
年
年,
,
,是
是
是中
中
中国
国
国最
最
最重
重
重要
要
要的
的
的传
传
传统
统
统节
节
节日
日
日。
。

ピンイン

{
  "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
  }
}
cjjnlxnszgzzydctjr chun jie ji nong li xin nian shi zhong guo zui zhong yao de chuan tong jie ri

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

ピンイン固有のトークンフィルタリングを行います。

{
  "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
}

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