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 |
全文転置インデックスのパラメーターを指定します。以下のパラメーターがサポートされています。
説明
各インデックスは、1 つの |
index_options 構成
index_options パラメーターは 3 つのレベルをサポートしています。上位レベルのオプションには、下位レベルのすべての情報が自動的に含まれます。freqs には docs のすべての情報が含まれ、positions には freqs と docs のすべての情報が含まれます。
|
値 |
インデックスの内容 |
影響と制限 |
使用例 |
|
positions (デフォルト) |
ドキュメント ID + 用語頻度 + 位置 |
全機能サポート:フレーズクエリと標準的な関連度スコアリングをサポートします。 |
一般的な全文検索シナリオ。 |
|
freqs |
ドキュメント ID + 用語頻度 |
フレーズクエリはサポートされておらず、エラーが返されます。 |
用語頻度に基づくスコアリングとランキングが必要だが、正確なフレーズマッチングは不要なシナリオ。 |
|
docs |
ドキュメント ID のみ |
|
存在チェック (フィルタリング) のみが必要で、関連度スコアリングが不要なストレージ重視のシナリオに最適です。 |
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_optionsをfreqsに設定します。これによりスペースが節約されますが、フレーズクエリはサポートされません。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'); -
インデックスのトークナイザーを
ikのik_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_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;
パラメーター:
-
ネームスペース:
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 |
はい |
検索ソース。サポートされるデータ型は |
|
search_expression |
はい |
検索オブジェクト。サポートされるデータ型は |
|
mode |
いいえ |
検索モード。以下のモードがサポートされています。
|
|
operator |
いいえ |
キーワード間で使用する論理演算子を指定します。このパラメーターは、mode が
|
|
tokenizer、analyzer_params |
いいえ |
search_expression のトークナイザーとその構成を指定します。ほとんどの場合、これらのパラメーターを構成する必要はありません。
|
|
options |
いいえ |
全文検索のその他のパラメーター。入力パラメーターの形式は
説明
slop パラメーターは、フレーズ内の単語間の最大許容間隔 (または変換コスト) を表します。 |
戻り値
検索ソースと検索オブジェクト間の 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:必須。トークン化する対象テキスト。このパラメーターは定数である必要があります。
-
tokenizer、analyzer_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 オブジェクトは、
tokenizerとfilterの 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_ngramとmin_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_chineseがtrueに設定されている場合にのみ有効です。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_chineseとkeep_none_chinese_togetherがtrueに設定されている場合にのみ有効です。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 のデフォルト設定を示します。
|
トークナイザー |
|
トークン化の例 |
|
jieba (デフォルトのトークナイザー) |
|
|
|
whitespace |
|
|
|
キーワード |
|
|
|
simple |
|
|
|
standard |
|
|
|
icu |
|
|
|
ik |
|
|
|
N-gram |
|
|
|
ピンイン |
|
|
filter の設定
Hologres は、analyzer_params で次のフィルターをサポートしています。
複数のフィルターは、指定された順序で適用されます。
|
フィルター |
説明 |
パラメーターフォーマット |
使用例 |
|
lowercase |
トークン内の大文字を小文字に変換します。 |
フィルター名を文字列で指定します。
|
|
|
stop |
ストップワードのトークンを削除します。 |
|
|
|
stemmer |
指定された言語の文法規則に基づいて、トークンをその語幹に変換します。 |
|
|
|
length |
指定された長さを超えるトークンを削除します。 |
|
|
|
removepunct |
句読文字のみで構成されるトークンを削除します。 |
フィルター名を文字列で指定します。
説明
V4.0.8 以降、
|
|
|
pinyin |
ピンイン固有のトークンフィルタリングを行います。 |
|
ピンイントークナイザーと同じプロパティを使用します。 |