このトピックでは、AnalyticDB for PostgreSQLの全文検索中にzhparser拡張を使用して中国語の単語セグメンテーションを実行する方法について説明します。
フルテキスト検索の概要
デフォルトでは、PostgreSQLはスペースと句読点に基づいて単語のセグメンテーションを実行します。 PostgreSQLは中国語の単語セグメンテーションをサポートしていません。 AnalyticDB for PostgreSQLをzhparser拡張機能と統合して、中国語の単語セグメンテーションをサポートできます。
ほとんどの場合、次のいずれかの方法を使用して、フルテキスト検索を実行できます。
テーブル内のデータの照会:
SELECT name FROM <table...> WHERE to_tsvector('english', name) @@ to_tsquery('english', 'friend');
一般化反転インデックス (GIN) インデックスを作成する:
CREATE INDEX <idx_...> ON <table...> USING gin(to_tsvector('english', name));
zhparser拡張機能の設定
zhparser拡張機能をインストールします。
AnalyticDB for PostgreSQLインスタンスでのフルテキスト検索中にzhparser拡張機能を使用して中国語の単語セグメンテーションを実行する前に、インスタンスのExtensionsページにzhparser拡張機能をインストールする必要があります。 詳細については、「拡張機能のインストール、更新、およびアンインストール」をご参照ください。
次のステートメントを実行してzhparserを中国語テキストパーサーとして設定し、テキスト検索設定名をzh_cnに設定します。
CREATE TEXT SEARCH CONFIGURATION zh_cn (PARSER = zhparser);
設定が完了したら、
\dF
または\dFp
コマンドを実行して設定を表示できます。単語のセグメンテーションに使用されるトークンの種類を照会します。
次のステートメントを実行して、zhparserの辞書構成を照会します。
SELECT ts_token_type('zhparser');
次の応答が返されます。
ts_token_type --------------------------------- (97,a,"adjective") (98,b,"differentiation") (99,c,"conjunction") (100,d,"adverb") (101,e,"exclamation") (102,f,"position") (103,g,"root") (104,h,"head") (105,i,"idiom") (106,j,"abbreviation") (107,k,"tail") (108,l,"tmp") (109,m,"numeral") (110,n,"noun") (111,o,"onomatopoeia") (112,p,"prepositional") (113,q,"quantity") (114,r,"pronoun") (115,s,"space") (116,t,"time") (117,u,"auxiliary") (118,v,"verb") (119,w,"punctuation") (120,x,"unknown") (121,y,"modal") (122,z,"status") (26 rows)
次のステートメントを実行して、zh_cnの設定を照会します。
SELECT * FROM pg_ts_config_map WHERE mapcfg=(SELECT oid FROM pg_ts_config WHERE cfgname='zh_cn');
トークンタイプを追加または削除します。
トークンタイプを追加します。
次のステートメントを実行して、単語分割に使用されるトークン型として、名詞、動詞、形容詞、イディオム、感嘆符、および一時イディオムを追加します。
ALTER TEXT SEARCH CONFIGURATION zh_cn ADD MAPPING FOR n,v,a,i,e,l WITH simple;
トークンの種類を削除します。
次のステートメントを実行して、単語分割に使用されるトークン型から名詞、動詞、形容詞、イディオム、感嘆符、および一時イディオムを削除します。
ALTER TEXT SEARCH CONFIGURATION zh_cn DROP MAPPING IF EXISTS FOR n,v,a,i,e,l;
フルテキスト検索中に中国語の単語セグメンテーション機能をテストするには、次の関数を使用します。
to_tsvector:
SELECT to_tsvector('zh_cn', '有两种方法进行全文检索');
次の応答が返されます。
to_tsvector --------------------------------------- '全文检索':4 '方法':2 '有':1 '进行':3 (1 ROW)
to_tsquery:
SELECT to_tsquery('zh_cn', '有两种方法进行全文检索');
次の応答が返されます。
to_tsquery ------------------------------------- '有' & '方法' & '进行' & '全文检索' (1 ROW)
カスタム辞書
zhparser拡張機能は、AnalyticDB for PostgreSQLのカスタム辞書をサポートします。 zhparser.zhprs_custom_word
という名前のカスタム辞書テーブルにデータを追加または削除して、カスタム単語を追加または削除できます。 zhparser.zhprs_custom_word
テーブルのデータ構造は次のとおりです。
辞書テーブルを手動で作成する必要はありません。 zhparser拡張子をインストールすると、
zhparser.zhprs_custom_word
というカスタム辞書テーブルが自動的に作成されます。zhparser拡張機能をインストールしている場合、システムは自動的に
zhparser.zhprs_custom_word
という名前のカスタム辞書テーブルを作成します。
CREATE TABLE zhparser.zhprs_custom_word
(
word text PRIMARY key, --- Custom word
tf FLOAT DEFAULT '1.0', --- The term frequency (TF) of the word. Default value: 1.0.
idf FLOAT DEFAULT '1.0', --- The inverse document frequency (IDF) of the word. Default value: 1.0.
attr CHAR DEFAULT '@', CHECK(attr = '@' OR attr = '!') --- The type of the word. Value values: @ (new word) and ! (stop word).
);
カスタム辞書設定の追加
次のステートメントを実行して、カスタムセグメンテーション設定をzh_cnに追加します。
ALTER TEXT SEARCH CONFIGURATION zh_cn ADD MAPPING FOR x with simple;
カスタム辞書テーブルに単語を追加する
INSERT INTO zhparser.zhprs_custom_word(word, attr) VALUES('两种方法', '@');
カスタム辞書テーブルから単語を削除
DELETE FROM zhparser.zhprs_custom_word WHERE word='两种方法';
カスタム辞書テーブルの照会
SELECT * FROM zhparser.zhprs_custom_word;
カスタム辞書テーブルの読み込み
zhparser.zhprs_custom_wordテーブルに単語を追加または削除した後、テーブルをリロードして変更を有効にする必要があります。 次のステートメントを実行して、zhparser.zhprs_custom_wordテーブルをリロードします。
SELECT sync_zhprs_custom_word();
中国語の単語セグメンテーション効果を確認する
zhparser.zhprs_custom_wordテーブルを設定する前後に次のステートメントを実行して、中国語の単語セグメンテーション効果を確認します。
SELECT to_tsvector('zh_cn', '有两种方法进行全文检索');
次の単語セグメンテーション効果が返されます。
zhparser.zhprs_custom_wordテーブルを設定する前
+---------------------------------------+
| to_tsvector |
+---------------------------------------+
|'全文检索':4 '方法':2 '有':1 '进行':3 |
+---------------------------------------+
(1 ROW)
zhparser.zhprs_custom_wordテーブルの設定後
+---------------------------------------+
| to_tsvector |
+---------------------------------------+
|'两种方法':2 '全文检索':4 '有':1 '进行':3|
+---------------------------------------+
(1 ROW)
関連ドキュメント
フルテキスト検索の詳細については、 フルテキスト検索。
フルテキスト検索に使用できる関数と演算子については、 テキスト検索関数と演算子