目次
はじめに
Vertica8.0から、テキストインデックスがマルチバイト文字対応となり、日本語による全文検索が可能になりました。本記事では、テキストインデックスを用いた日本語による全文検索を行う方法を紹介します。
テキストインデックスを用いた日本語による全文検索を行う手順
VerticaではICU Tokenizerというトークナイザーを使用することにより、日本語を含むマルチバイトの文字を識別することができます。そのため、テキストインデックスを使ってマルチバイト文字の検索を行うためには、まずICU Tokenizerを構成する必要があります。
ICU Tokenizerの構成
1.トークナイザーを構成しますICU Tokenizerの構成は、CREATE TRANSFORM FUNCTION文にて行います。
構文
| 
					 1  | 
						CREATE TRANSFORM FUNCTION 'ファンクション名' AS LANGUAGE 'C++' NAME 'ICUTokenizerFactory' LIBRARY v_txtindex.logSearchLib ;  | 
					
CREATE TRANSFORM FUNCTION文の詳細については、以下をご確認ください。
CREATE TRANSFORM FUNCTION
https://my.vertica.com/docs/9.2.x/HTML/index.htm#Authoring/SQLReferenceManual/Statements/CREATETRANSFORMFUNCTION.htm
実行例
| 
					 1 2  | 
						dbadmin=> CREATE OR REPLACE TRANSFORM FUNCTION v_txtindex.ICUJapaneseTokenizer AS LANGUAGE 'C++' NAME 'ICUTokenizerFactory' LIBRARY v_txtindex.logSearchLib NOT FENCED; CREATE TRANSFORM FUNCTION  | 
					
2.トークナイザーのプロシージャIDを確認します
| 
					 1 2 3 4 5  | 
						dbadmin=> SELECT proc_oid FROM vs_procedures WHERE procedure_name = 'ICUJapaneseTokenizer';      proc_oid -------------------  45035996273724064 (1 row)  | 
					
3.先ほどのプロシージャIDを使用し、トークナイザーのロケールを日本語に設定します
ロケールの設定は、SET_TOKENIZER_PARAMETER関数にて行います。
構文
| 
					 1  | 
						SELECT v_txtindex.SET_TOKENIZER_PARAMETER('パラメータ名','値' USING PARAMETERS proc_oid='プロシージャID');  | 
					
SET_TOKENIZER_PARAMETER関数の詳細については、以下をご確認ください。
SET_TOKENIZER_PARAMETER
https://my.vertica.com/docs/9.2.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/VerticaFunctions/TextSearch/setTokenizerParameter.htm
実行例
| 
					 1 2 3 4 5  | 
						dbadmin=> SELECT v_txtindex.SET_TOKENIZER_PARAMETER('locale','ja_JP' USING PARAMETERS proc_oid='45035996273724064');  SET_TOKENIZER_PARAMETER -------------------------  t (1 row)  | 
					
4.トークナイザーを有効化します
| 
					 1 2 3 4 5  | 
						dbadmin=>  SELECT v_txtindex.SET_TOKENIZER_PARAMETER('used','true' USING PARAMETERS proc_oid='45035996273724064');  SET_TOKENIZER_PARAMETER -------------------------  t (1 row)  | 
					
これで全文検索する準備は完了です。
テキストインデックスの作成
以下のテーブルに対して、テキストインデックスを作成していきます。| 
					 1 2 3 4 5 6  | 
						dbadmin=> select * from table1;  col1 |            col2 ------+----------------------------     1 | アシストは市ヶ谷が本社です     2 | 今年は平成31年です。 (2 rows)  | 
					
1.テキストインデックスの作成
テキストインデックスの作成は、CREATE TEXT INDEX文にて行います。
構文
| 
					 1  | 
						CREATE TEXT INDEX 'インデックス名' ON 'テーブル名'('列名1','列名2')TOKENIZER  'トークナイザー名(データ型)';;  | 
					
CREATE TEXT INDEX文の詳細は、以下をご確認ください。
CREATE TEXT INDEX
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/Statements/CREATETEXTINDEX.htm
実行例
| 
					 1 2  | 
						dbadmin=> CREATE TEXT INDEX index_table1 ON table1(col1,col2) TOKENIZER v_txtindex.ICUJapaneseTokenizer(long varchar) stemmer none; CREATE INDEX  | 
					
2.作成したインデックスの確認
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | 
						dbadmin=> SELECT * FROM index_table1 ORDER BY doc_id;    token   | doc_id ----------+--------  本社       |      1  が          |      1  です       |      1  市ヶ谷    |      1  は          |      1  アシスト |      1  は          |      2  今年       |      2  です       |      2  平成       |      2  年          |      2  31         |      2 (12 rows)  | 
					
テキストインデックスを用いた日本語による全文検索
構文
| 
					 1  | 
						 SELECT * FROM テーブル名 WHERE '検索対象の列名' IN (SELECT doc_id FROM 'インデックス名' WHERE token = v_txtindex.StemmerCaseInsensitive('検索したい文字列'));  | 
					
table1テーブルから「アシスト」を含むデータをテキストインデックスを使用して検索します。
実行例
| 
					 1 2 3 4 5  | 
						dbadmin=> SELECT * FROM table1 WHERE col1 IN (SELECT doc_id FROM index_table1 WHERE token = v_txtindex.StemmerCaseInsensitive('アシスト'));  col1 |             col2 ------+------------------------------     1 | アシストは市ヶ谷が本社です。 (1 row)  | 
					
参考情報
ICU Tokenizerhttps://my.vertica.com/docs/9.2.x/HTML/index.htm#Authoring/AdministratorsGuide/Tables/TextSearch/AdvancedTextSearch/ICUTokenizer.htm
検証バージョンについて
この記事の内容はVertica 9.2で確認しています。更新履歴
2019/04/15 検証バージョンを9.2に変更2016/12/02 本記事を公開

