Hologres V4.0 以降では、全文転置インデックスがサポートされています。この機能は、高性能な全文検索エンジンである Tantivy 上に構築されています。高性能な取得を提供し、ドキュメントのソート、キーワード検索、フレーズ検索のための BM25 類似度スコアリングアルゴリズムをサポートします。
仕組み
ソーステキストを Hologres に書き込むと、インデックス構成に基づいて、データファイルごとに全文転置インデックスファイルが構築されます。まず、トークナイザーがテキストをトークンに分割します。次に、インデックスは各トークンとソーステキストとの間のマッピングを記録します。また、位置や用語頻度などの情報も記録します。
テキストを検索するには、まず検索クエリがターゲットトークンのセットにトークン化されます。次に、BM25 アルゴリズムが、ターゲットトークンに対する各ソーステキストの関連度スコアを計算します。このプロセスにより、高速で正確な全文検索が可能になります。
注意事項
Hologres V4.0 以降では、全文転置インデックスは列指向テーブルと行列ハイブリッドテーブルでのみサポートされます。行指向テーブルはサポートされていません。
全文転置インデックスは、TEXT、CHAR、または VARCHAR データ型の列にのみ作成できます。
一度に 1 つの列にしか全文転置インデックスを構築できません。各列は 1 つの全文転置インデックスのみをサポートします。複数の列にインデックスを作成するには、列ごとに個別のインデックスを作成する必要があります。
全文転置インデックスを作成した後、既存のデータと新しくインポートされたデータのインデックスファイルは、データコンパクションプロセス中に非同期で構築されます。インデックスファイルが構築されるまで、データの BM25 関連度スコアは 0 になります。
全文転置インデックスを作成した後のリアルタイムデータ書き込みについて:Hologres V4.0.8 より前のバージョンでは、インデックスはリアルタイムデータ書き込みと同期して構築されていました。V4.0.8 以降では、システムはメモリ内のリアルタイムインデックスを 1 秒ごとに非同期でリフレッシュします。これにより、効率的なデータ書き込みとインデックス構築が保証されます。データは、インデックスがリフレッシュされた後にのみインデックスを使用してクエリできます。
全文検索は、全文インデックスを持つ列に対してのみ実行できます。インデックスが作成されていない列に対する総当たり検索はサポートされていません。
バッチデータインポートには Serverless Computing リソースを使用できます。Serverless リソースは、データインポート中にコンパクションと全文インデックス構築を同期的に完了します。詳細については、「読み取りおよび書き込みタスクに Serverless Computing を使用する」および「コンパクションタスクに Serverless Computing を使用する」をご参照ください。Serverless リソースを使用しない場合は、バッチでデータをインポートした後、またはインデックスを変更した後に、手動で次のコマンドを実行してコンパクションをトリガーする必要があります。
VACUUM <schema_name>.<table_name>;BM25 検索アルゴリズムは、ファイルレベルで関連度スコアを計算します。少量のデータをインポートした場合は、手動でコンパクションをトリガーしてファイルをマージし、検索精度を向上させることができます。
全文検索クエリの実行には、Serverless Computing リソースを使用できます。
次の表のシナリオに基づいてトークナイザーを選択できます:
シナリオ
トークナイザー
注意事項
長文からのキーワード抽出
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 | 全文転置インデックスのパラメーター。パラメーターには 2 種類あります:
説明 同じインデックス内で設定できる `tokenizer` と `analyzer_params` は 1 種類のみです。 |
例
デフォルトのトークナイザーと構成を使用する全文転置インデックスを作成します。デフォルトのトークナイザーは 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"]}');
全文転置インデックスを作成した後、データがインポートされた後のコンパクションプロセス中にインデックスファイルが構築されます。
バッチデータインポートには Serverless Computing リソースを使用できます。Serverless リソースは、データインポート中にコンパクションと全文インデックス構築を同期的に完了します。詳細については、「読み取りおよび書き込みタスクに Serverless Computing を使用する」および「コンパクションタスクに Serverless Computing を使用する」をご参照ください。
Serverless リソースを使用しない場合は、バッチでデータをインポートした後、またはインデックスを変更した後に、手動で次のコマンドを実行してコンパクションをトリガーする必要があります。詳細については、「コンパクション (ベータ)」をご参照ください。
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); ALTER INDEX idx1 RESET (tokenizer, analyzer_params);`analyzer_params` 構成を現在のトークナイザーのデフォルトにリセットします。
ALTER INDEX idx1 RESET (analyzer_params);
インデックスの削除
構文
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:インデックスの名前。
全文検索のためのインデックスの使用
Hologres は、必要に応じて柔軟に全文検索を実行できるさまざまな検索モードをサポートしています。
検索モード | 説明 |
キーワード一致 | トークン化された検索クエリのキーワードで検索します。キーワード間の AND/OR 関係を定義できます。 |
フレーズ検索 | 検索クエリのフレーズで検索します。一致するには、複数の単語間の距離が指定された要件を満たす必要があります。 |
自然言語検索 | 複雑なクエリ条件を定義して、AND/OR 関係、必須単語、除外単語、フレーズの定義など、検索目標を柔軟に達成できます。 |
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 | いいえ | 検索モード。次のモードがサポートされています:
|
operator | いいえ | キーワード間の論理演算子。このパラメーターは、mode が `match` に設定されている場合にのみ有効です。次の値がサポートされています:
|
tokenizer、analyzer_params | いいえ | 検索クエリ search_expression に使用されるトークナイザーと構成。通常、これらのパラメーターを構成する必要はありません。
|
options | いいえ | 全文インデックスのその他のパラメーター。これらのパラメーターは 現在、slop パラメーターのみがサポートされています。これは mode が phrase に設定されている場合にのみ有効です。slop は 0 (デフォルト) または正の整数に設定できます。この値は、フレーズ内の term 間に許容される最大距離を定義します。 説明 slop 値は、フレーズ内の term 間に許容される最大ギャップ、つまり変換オーバーヘッドを指定します。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; -- + (必須) および - (除外) を使用してトークン検索ロジックを定義します。 SELECT TEXT_SEARCH (content, '+learning -machine system', 'natural_language') FROM tbl;Term 検索モードを使用します。
SELECT TEXT_SEARCH (content, 'machine learning', 'term') 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 と 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使用例
データ準備
次の 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, 'The Yangtze River is the longest river in China and the third longest in the world, with a total length of about 6,300 kilometers.'),
(2, 'Li was born in 1962 in Wendeng County, Shandong.'),
(3, 'He graduated from the department of physics at Shandong University.'),
(4, 'The Spring Festival, also known as the Lunar New Year, is the most important traditional festival in China.'),
(5, 'The Spring Festival usually falls between late January and mid-February in the Gregorian calendar. Main customs during the Spring Festival include pasting spring couplets, setting off firecrackers, having a New Year''s Eve dinner, and making New Year visits.'),
(6, 'In 2006, the Spring Festival was approved by the State Council as one of the first national intangible cultural heritages.'),
(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 | The Yangtze River is the longest river in China and the third longest in the world, with a total length of about 6,300 kilometers.さまざまな検索例
キーワード一致。
-- (K1) キーワード一致 (デフォルト operator=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) キーワード一致 (operator=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.フレーズ検索。
-- (P1) フレーズ検索 (デフォルト slop = 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) slop = 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) フレーズ検索は順序不同のフレーズをサポートしますが、slop の計算が異なり、順序付きフレーズよりも大きな値が必要です。 -- したがって、'university of Shandong' も次のクエリに一致しますが、slop=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 トークナイザーインデックスでの動作。(ALTER INDEX ft_idx_1 SET (tokenizer = 'standard');) -- standard トークナイザーの場合、slop はトークンで計算されます。 -- 間に 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 トークナイザーの例) -- テキストでは 'river' と 'with' の間にカンマがあり、クエリ文字列にはピリオドがありますが、一致します。 SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'river. with', mode => 'phrase') > 0; -- 結果 id | content ----+----------------------------------------------------- 1 | The Yangtze River is the longest river in China and the third longest in the world, with a total length of about 6,300 kilometers. (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' AND 'university') OR 'heritage' を含む必要があります。AND オペレーターは OR よりも優先順位が高いです。 SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '(shandong AND university) OR heritage', 'natural_language') > 0; -- 以下と同等 SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong AND university OR heritage', 'natural_language') > 0; -- 以下と同等 SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '(+shandong +university) heritage', '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 | In 2006, the Spring Festival was approved by the State Council as one of the first national intangible cultural heritages. -- (N3) 自然言語クエリ:キーワード一致。'shandong' を含み、'university' を含まず、'heritage' を含む可能性があります。 -- このクエリでは、'heritage' キーワードには + または - 記号がないため、どの行が一致するかに影響しません。ただし、一致スコアには影響します。'heritage' を含む行はスコアが高くなります。 SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '+shandong -university heritage', 'natural_language') > 0; id | content ----+-------------------------------------------------- 2 | Li was born in 1962 in Wendeng County, Shandong. -- 'shandong' を含み、'physics' を含まず、'famous' を含む可能性があります。'famous' を含む場合、関連度スコアは高くなります。 -- 注:このクエリは、単一シャードでのスコア計算結果を示しています。計算された 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) 自然言語クエリ:フレーズ検索。(P2) と同等。~ 構文で slop を設定できます。 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 | The Yangtze River is the longest river in China and the third longest in the world, with a total length of about 6,300 kilometers. 2 | Li was born in 1962 in Wendeng County, Shandong. 3 | He graduated from the department of physics at Shandong University. 4 | The Spring Festival, also known as the Lunar New Year, is the most important traditional festival in China. 5 | The Spring Festival usually falls between late January and mid-February in the Gregorian calendar. Main customs during the Spring Festival include pasting spring couplets, setting off firecrackers, having a New Year's Eve dinner, and making New Year visits. 6 | In 2006, the Spring Festival was approved by the State Council as one of the first national intangible cultural heritages. 7 | Shandong has dozens of universities. 8 | ShanDa is a famous university of Shandong.Term 検索。
-- (T1) Term クエリ:トークン化結果に "Spring Festival" が明示的に含まれているため、取得できます。 SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'Spring Festival', 'term') > 0; -- 結果 id | content ----+---------------------------------------------------------------------------------------------- 4 | The Spring Festival, also known as the Lunar New Year, is the most important traditional festival in China. 5 | The Spring Festival usually falls between late January and mid-February in the Gregorian calendar. Main customs during the Spring Festival include pasting spring couplets, setting off firecrackers, having a New Year's Eve dinner, and making New Year visits. 6 | In 2006, the Spring Festival was approved by the State Council as one of the first national intangible cultural heritages. -- (T2) Term クエリ:結果が返されない例。 -- wiki_articles ソーステーブルの content 列はデフォルトで Jieba トークナイザーを使用しており、"shandong university" を分割するためです。 -- keyword トークナイザーで term クエリを使用することを推奨します。その場合、対象データを取得できます。 SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', 'term') > 0; -- 結果 id | content ----+---------
複雑なクエリの例
プライマリキーでのクエリ。
-- '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 | The Yangtze River is the longest river in China and the third longest in the world, with a total length of about 6,300 kilometers. 3 | He graduated from the department of physics at Shandong University. 7 | Shandong has dozens of universities.スコアを取得し、上位 3 件の結果を取得します。
1. Analysis of the English text structure and meaning: This is a SQL code block with comments and sample output. The code demonstrates a SELECT query using TEXT_SEARCH and TOKENIZE functions on a wiki_articles table. The comment "-- Result" indicates the following table is the query result. 2. Identification of technical terms and their proper translations: - "SELECT", "FROM", "ORDER BY", "LIMIT" are SQL keywords → keep in English - "TEXT_SEARCH" and "TOKENIZE" are function names → keep in English - "jieba" is a specific tokenizer library name → keep in English - "wiki_articles" is a table name → keep in English - "shandong university" is a search term → keep in English - The comment "-- Result" should be translated to Japanese as it's explanatory text 3. Consideration of context and tone: This is a technical code example, so the translation should maintain the code's integrity while translating only the explanatory parts (comments). The output table headers and data should remain in English since they're part of the code execution result. 4. Draft translation with reasoning: - The SQL code itself remains unchanged (keywords, function names, table names, search terms) - The comment "-- Result" becomes "-- 結果" - The output table's header row and data rows remain in English as they represent actual query output - Need to ensure HTML attributes like code-type, data-tag, id, index, outputclass are preserved exactly 5. Optimization and final review: - Verify all SQL syntax remains intact - Confirm only the comment is translated - Check that HTML structure and attributes are preserved - Ensure proper spacing between Japanese and English elements (though here only the comment has Japanese, so no spacing issues) 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}
使用上の推奨事項
Serverless リソースを使用したインデックスの再作成
テーブルプロパティを変更すると、コンパクションがトリガーされ、インデックスが再構築される可能性があり、大量の CPU リソースを消費します。次のテーブルプロパティを変更するには、以下の手順を実行します:
-
`bitmap_columns`、`dictionary_encoding_columns`、またはベクターインデックスを変更すると、コンパクションとインデックスの再作成がトリガーされます。したがって、`ALTER TABLE xxx SET` 構文は使用せず、代わりに次のコマンドを実行して `REBUILD` 構文を Serverless Computing リソースとともに使用します。詳細については、「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
}
}
}'
);
-
列指向 JSONB 列または全文インデックス列を変更すると、コンパクションとインデックスの再作成もトリガーされます。これらの変更には `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);
-- 一時テーブルにデータを挿入し、Serverless リソースを使用してジョブを実行し、インデックス構築を同期的に完了します。
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`、ストレージフォーマットなど、他のプロパティを変更するには、Serverless Computing リソースとともに `REBUILD` 構文を使用します。
高度な操作:トークナイザー構成のカスタマイズ
Hologres では、デフォルトのトークナイザー構成を使用することを推奨します。ただし、場合によっては、デフォルトの構成がビジネスニーズを満たさないことがあります。より柔軟なトークン化のために、トークナイザー構成をカスタマイズできます。
analyzer_params の構成要件
`analyzer_params` パラメーターには、次の構成要件があります:
JSON 形式の文字列のみがサポートされます。
JSON のトップレベルは、`tokenizer` と `filter` の 2 つのキーをサポートします。
filter:オプション。値は、トークンフィルタープロパティを構成するために使用される JSON 配列です。複数のトークンフィルタープロパティを構成した場合、それらは指定された順序で各トークンに適用されます。
tokenizer:必須。値は、トークナイザープロパティを構成するために使用される JSON オブジェクトです。JSON オブジェクトは次のキーをサポートします:
type:必須。トークナイザー名。
tokenizer オブジェクトのその他のパラメーター。異なるトークナイザーは、次の表に示すように、異なるパラメーターをサポートします:
トークナイザー
tokenizer オブジェクトの
その他のパラメーターパラメーターの説明
パラメーターの値
jieba
mode
トークン化モードを定義します。
search (デフォルト):トークン化中に複数の可能な組み合わせをリストし、冗長性を許容します。たとえば、「traditional festival」のトークン化結果は「traditional」、「festival」、「traditional festival」です。
exact:トークン化中の冗長な分割を防ぎます。たとえば、「traditional festival」のトークン化結果は「traditional festival」のみです。
hmm
辞書にない単語を識別するために隠れマルコフモデル (HMM) を使用するかどうかを指定します。これにより、新語の認識が向上します。
true (デフォルト):有効
false:無効
standard
max_token_length
最大トークン長。
正の整数。デフォルト値は 255 です。トークンがこの長さを超えると、`max_token_length` の間隔で分割されます。
ik
mode
トークン化モードを定義します。
ik_max_word (デフォルト):すべての可能な短い単語を出力する、細かい粒度のトークン化を実行します。たとえば、「南京市」のトークン化結果は「南京」と「市」です。
ik_smart:長い単語を優先し、分割数を減らす粗い粒度のトークン化を実行します。出力トークンは重複しません。このモードは、数値と数量詞を単一のトークンに結合しようとします。たとえば、「南京市」と「1 キロメートル」はさらにトークン化されません。
enable_lowercase
トークンを小文字に変換するかどうかを指定します。
true (デフォルト)
false
ngram
min_ngram
トークンの最小文字長。
正の数。デフォルト値は 1 です。`min_ngram` と `max_ngram` の最大差は 3 です。
注:次の GUC を設定することで、最大差を調整できます。例:
SET hg_fulltext_index_max_ngram_diff = 5。max_ngram
トークンの最大文字長。
デフォルト値は 2 です。値は [1, 255] の範囲内である必要があります。`min_ngram` と `max_ngram` の最大差は 3 です。
説明`max_ngram` と `min_ngram` の差が大きすぎると、ngram トークナイザーは多くのトークンを生成します。これにより、リソース消費が増加し、より多くのインデックスストレージが必要になり、インデックス構築時間が長くなる可能性があります。
prefix_only
プレフィックスのみを考慮するかどうかを指定します。
true
false (デフォルト)
pinyin
keep_first_letter
各漢字の最初の文字をトークンとして保持するかどうかを指定します。
true (デフォルト): 頭文字を保持します。たとえば、「Li Ming」のトークン化の結果には「lm」が含まれます。
false:保持しません。
keep_separate_first_letter
各漢字の最初の文字を個別のトークンとして保持するかどうかを指定します。
true: 頭文字を個別に保持します。たとえば、 "Li Ming" のトークン化の結果には "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 李明」のトークン化結果が「DJ,li,ming」となり、「DJ」が一緒になるなど、非中国語の文字を一緒に保持します。
false:「DJ 李明」のトークン化結果が「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
非中国語の文字が有効なピンインである場合、それらを個別のピンイン term に分割するかどうかを指定します。
true (デフォルト):「limingalibaba2025」のトークン化結果に「li,ming,a,li,ba,ba,2025」が含まれるなど、term を分割します。
false:term を分割しません。
説明このパラメーターは、`keep_none_chinese` と `keep_none_chinese_together` が `true` に設定されている場合にのみ有効です。
keep_original
元の入力を保持するかどうかを指定します。
true:元の入力を保持します。
false (デフォルト):元の入力を保持しません。
lowercase
非中国語の文字を小文字に変換するかどうかを指定します。
true (デフォルト)
false
trim_whitespace
空白文字をトリミングするかどうかを指定します。
true (デフォルト)
false
remove_duplicated_term
重複する term を削除するかどうかを指定します。
このパラメーターを true に設定すると、特定のトークンが削除されます。たとえば、「de的」は「de」としてトークン化され、「de的」のフレーズクエリの結果に影響します。
false (デフォルト):重複する term を削除しません。
keep_separate_chinese
個々の漢字を個別のトークンとして保持するかどうかを指定します。
true: 個々の文字を保持します。たとえば、「Li Ming」をトークン化すると、「Li」と「Ming」の 2 つのトークンが生成されます。
false (デフォルト):アイテムは保持されません。
デフォルトの analyzer_params 構成
さまざまなトークナイザーのデフォルトの `analyzer_params` 構成は次のとおりです:
アナライザー名 | デフォルトの analyzer_params 構成 | トークン化の例 |
jieba (デフォルトアナライザー) | | |
whitespace | | |
keyword | | |
simple | | |
standard | | |
icu | | |
ik | | |
ngram | | |
pinyin | | |
analyzer_params のフィルター構成
Hologres は、`analyzer_params` で次のフィルター (トークンフィルタープロパティとも呼ばれます) をサポートしています。
複数のトークンフィルタープロパティを構成した場合、それらは指定された順序で各トークンに適用されます。
プロパティ名 | プロパティの説明 | パラメーターフォーマット | 例 |
lowercase | トークン内の大文字を小文字に変換します。 | `lowercase` を宣言します。 |
|
stop | ストップワードトークンを削除します。 |
|
|
stemmer | 言語の文法規則に基づいて、トークンを対応する語幹に変換します。 |
|
|
length | 指定された長さを超えるトークンを削除します。 |
|
|
removepunct | 句読文字のみで構成されるトークンを削除します。 | `removepunct` を宣言します。 説明 V4.0.8 以降では、`removepunct` には削除モードを定義する新しい `mode` パラメーターがあります。値は次のとおりです:
|
|
pinyin | ピンイントークンフィルター。 | | フィルター構成プロパティは、Pinyin トークナイザーと同じです。 |