IK アナライザープラグイン (analysis-ik) は、Alibaba Cloud Elasticsearch (ES) で中国語テキストの形態素解析機能を提供し、複数の組み込み辞書タイプを備えています。辞書をカスタマイズまたは拡張して形態素解析の精度を向上させたり、リモート管理のために Object Storage Service (OSS) から辞書ファイルを動的にロードしたりすることができます。
背景情報
IK アナライザープラグインは、トークナイザー、辞書ファイル、更新メカニズムの 3 つのコンポーネントで構成されています。
Alibaba Cloud Elasticsearch の IK アナライザープラグインは、オープンソースの IK プラグイン (infinilabs/analysis-ik) をベースにしています。main.dic や stopword.dic などのデフォルト辞書は、オープンソース版と同一です。また、Alibaba Cloud Elasticsearch は、Object Storage Service (OSS) から辞書ファイルを動的にロードすることもサポートしています。
IK アナライザープラグインのバージョンは、Elasticsearch クラスターのバージョンと一致させる必要があります。例えば、クラスターのバージョンが 8.17 の場合、IK アナライザープラグインもバージョン 8.17 です。
-
トークナイザー:中国語テキストを意味のあるトークンに分割し、形態素解析の粒度を制御します。
-
辞書ファイル:トークナイザーが分割に使用する語彙を提供します。辞書はカスタマイズおよび拡張に対応しています。
-
辞書の更新方法:コールドアップデートとホットアップデートの両方をサポートしており、ビジネス要件に合わせて柔軟に辞書を調整できます。
形態素解析ルール
IK アナライザーは、次の 2 つの形態素解析モードをサポートしています:
-
ik_max_word:最も細かい粒度でテキストを分割します。タームベースのクエリに適しています。
-
ik_smart:より粗い粒度でテキストを分割します。フレーズベースのクエリに適しています。
辞書タイプ
IK アナライザーは、次の辞書タイプをサポートしています:
|
辞書タイプ |
説明 |
ファイル要件 |
サポートされる更新方法 |
|
メイン辞書 |
デフォルトのメイン辞書である ES インデックスにメイン辞書を設定すると、クラスターはインデックス作成時に受信データをこの辞書と照合します。一致したタームは、対応するキーワードを使用して検索可能になります。 |
1 行に 1 単語を記載し、 |
|
|
ストップワード辞書 |
デフォルトのストップワード辞書である ES インデックスにストップワード辞書を設定すると、クラスターはインデックス作成時に一致したタームを除外します。クラスターは、除外されたタームを転置インデックスに含めません。 |
||
|
前置詞辞書 |
デフォルトの前置詞辞書である |
1 行に 1 単語を記載し、 |
|
|
数量詞辞書 |
デフォルトの数量詞辞書である |
||
|
suffix.dic |
接尾辞の用語を格納し、トークナイザーが接尾辞を含む単語を分割できるようにします。 |
該当なし |
更新はサポートされていません |
|
surname.dic |
一般的な中国語の姓を格納し、トークナイザーが人名を認識できるようにします。 |
辞書の更新方法
デフォルトの辞書が要件を満たさない場合は、辞書を更新します。IK アナライザーは、次の方法をサポートしています:
|
更新方法 |
説明 |
シナリオ |
|
ES クラスターを再起動し、すべてのノードに辞書の変更を適用します。 アップロードしたファイルはすべての ES ノードに配布され、ノードが再起動します。再起動が完了すると変更が反映されます。 |
|
|
説明
メイン辞書またはストップワード辞書の更新のみをサポートします。 重要
ホットアップデートを初めて設定する場合、または辞書ファイルのリストを変更する場合 (辞書ファイルの追加、削除、または名前変更)、クラスターが再起動します。以降は、ファイル名を変更せずに既存の辞書ファイルの内容のみを変更する場合に限り、再起動なしで動的に反映されます。業務への影響を避けるため、これらの操作はオフピーク時間帯に実施することを推奨します。 |
|
ES 辞書タイプの比較
Alibaba Cloud Elasticsearch は、類義語辞書、IK 辞書、AliNLP 辞書 (analysis-aliws) の 3 つの辞書タイプをサポートしています。次の表では、更新方法、再起動の有無、API オペレーション、ファイル形式の要件を比較しています。
|
辞書タイプ |
更新方法 |
クラスター再起動の要否 |
API オペレーション |
ファイル形式 |
|
類義語辞書 |
Solr または |
要。変更はクラスターの再起動後にのみ反映されます。 |
該当なし |
|
|
IK 辞書 (メイン辞書、コールド/ホット拡張辞書、ストップワード辞書を含む) |
コンソールで辞書ファイルをアップロードするか、対応する API オペレーションを呼び出して辞書ファイルをアップロードします。 |
|
ホットアップデートでは、 |
|
|
AliNLP 辞書 (analysis-aliws) |
|
要 |
該当なし |
|
IK 辞書と AliNLP 辞書は、[OSS ファイルのアップロード] の方法でのみリモート辞書ファイルのロードをサポートしています。
すべての辞書タイプに共通する注意点は次のとおりです:
-
料金:辞書の更新に追加料金は発生しません。
-
ファイルサイズの上限:辞書ファイル 1 つあたりのサイズは最大 100 MB です。辞書ファイルの合計サイズは 200 MB を超えることはできません。また、アップロードできる辞書ファイルは最大 50 個です。
-
バージョン互換性 —
analysis-aliws(AliNLP) プラグインは5.xまたは8.xバージョンではサポートされていません。 -
sourceType パラメーター — 辞書更新 API 操作を呼び出す際、辞書ファイルの初回アップロードでは
sourceTypeパラメーターをOSSに設定し、同じ名前の辞書ファイルの後続の更新ではORIGINに設定します。
前提条件
-
インスタンスは正常な状態である必要があります。詳細ページでインスタンスステータスを表示します。
説明このトピックでは、バージョン
7.10.0で実行されている Alibaba Cloud ES インスタンスを使用しています。コンソールのインターフェースと機能は、バージョンによって異なる場合があります。 -
(オプション) 辞書を更新する場合は、まず次の手順を実行してください。
-
[OSS ファイルのアップロード]で更新する場合:まず OSS バケットを作成し、必要な辞書ファイルをアップロードします。
-
[ローカルファイルのアップロード]で更新する場合:まず必要な辞書ファイルをローカルマシン に保存します。
-
IK 辞書の更新
デフォルトの IK 辞書が要件を満たさない場合は、IK 辞書を更新してください。作業を開始する前に、更新方法を確認してください。IK 形態素解析が設定済みのインデックスでは、辞書の更新は新規データにのみ適用されます。既存データに変更を適用するには、インデックスを再作成してください。
コールドアップデート
コールドアップデートを実行するには:
コールドアップデートではクラスターが再起動します。ピーク時間外に実施してください。
-
インスタンスの詳細ページに移動します。
-
Alibaba Cloud Elasticsearch コンソールにログインします。
-
左側メニューで Elasticsearch クラスター をクリックします。
-
上部メニューで、リソースグループとリージョンを選択します。
-
Elasticsearch インスタンスのリストで、対象のインスタンス ID をクリックして詳細ページに移動します。
-
-
analysis-ikプラグインのコールドアップデートページに移動します。-
左側メニューで を選択します。
-
ビルトインプラグインリスト タブで
analysis-ikプラグインを見つけ、アクション 列の 標準アップグレード をクリックします。
-
-
コールドアップデートを実行します。
-
IK 辞書設定 - コールドパッチ ダイアログボックスで、対象の辞書の 編集 をクリックし、画面の指示に従って必要な辞書ファイルをアップロードしてから 保存 をクリックします。
辞書ファイルは、次のいずれかの方法でアップロードできます:
-
ローカルファイルのアップロード:
アイコンをクリックするか、画面の指示に従ってローカルファイルをドラッグ&ドロップします。 -
OSS ファイルのアップロード:バケット名と辞書ファイル名を入力し、追加 をクリックします。
-
バケットと Elasticsearch インスタンスは、同じリージョンにある必要があります。
-
OSS の辞書ファイルは自動的に同期されません。ソースファイルが変更された場合は、辞書を更新して変更を適用してください。
-
説明-
各辞書タイプでアップロードできるファイルは、
DIC形式のファイル 1 つのみです。アップロードしたファイルは、元の辞書を置き換えます。 -
辞書ファイル名は
.dicで終わる必要があります。ファイル名には英字、数字、アンダースコアを使用でき、30 文字以内にする必要があります。 -
辞書をデフォルトファイルに戻すには、デフォルトファイルをダウンロードして再アップロードします。デフォルト辞書ファイルは、次のリンクから取得できます:
-
-
リスク確認に同意し、OK をクリックしてインスタンスを再起動します。
インスタンスの再起動後、辞書の更新が完了します。
-
-
(任意)辞書の更新が反映されたかどうかを確認します。
-
Kibana コンソールにログインします。
-
左上の
アイコンをクリックし、 を選択してコードエディターを開きます。次のコードを実行して、入力テキスト
Chinese character input method for computersを粗い粒度で形態素解析します。説明実際の運用では、
textの値を辞書内の単語に置き換えてください。GET _analyze { "analyzer": "ik_smart", "text": "Chinese character input method for computers" }想定されるレスポンスは次のとおりです:
{ "tokens" : [ { "token" : "chinese", "start_offset" : 0, "end_offset" : 7, "type" : "ENGLISH", "position" : 0 }, { "token" : "character", "start_offset" : 8, "end_offset" : 17, "type" : "ENGLISH", "position" : 1 }, { "token" : "input", "start_offset" : 18, "end_offset" : 23, "type" : "ENGLISH", "position" : 2 }, { "token" : "method", "start_offset" : 24, "end_offset" : 30, "type" : "ENGLISH", "position" : 3 }, { "token" : "for", "start_offset" : 31, "end_offset" : 34, "type" : "ENGLISH", "position" : 4 }, { "token" : "computers", "start_offset" : 35, "end_offset" : 44, "type" : "ENGLISH", "position" : 5 } ] }
-
ホットアップデート
ホットアップデートを実行するには:
既存の辞書ファイルについて、ファイル名を変更せずに内容のみを変更する場合、クラスターは再起動しません。辞書ファイル名、またはファイル数が変更された場合、もしくはホットアップデートを初めて設定する場合は、クラスターが再起動します。業務への影響を最小限に抑えるため、ピーク時間外に実施してください。再起動後、辞書は自動的に有効になります。
-
インスタンスの詳細ページに移動します。
-
Alibaba Cloud Elasticsearch コンソールにログインします。
-
左側メニューで Elasticsearch クラスター をクリックします。
-
上部メニューで、リソースグループとリージョンを選択します。
-
Elasticsearch インスタンスのリストで、対象のインスタンス ID をクリックして詳細ページに移動します。
-
-
analysis-ikプラグインのホットアップデートページに移動します。-
左側メニューで を選択します。
-
ビルトインプラグインリスト タブで
analysis-ikプラグインを見つけ、アクション 列の ローリングアップグレード をクリックします。
-
-
ホットアップデートを実行します。
-
IK 辞書設定 - ホットパッチ ダイアログボックスで、対象の辞書の 編集 をクリックします。画面の指示に従って必要な辞書ファイルをアップロードし、保存 をクリックします。
辞書ファイルは、次のいずれかの方法でアップロードできます:
-
ローカルファイルのアップロード:
アイコンをクリックするか、画面の指示に従ってローカルファイルをドラッグ&ドロップします。 -
OSS ファイルのアップロード:バケット名と辞書ファイル名を入力し、追加 をクリックします。
-
バケットと Elasticsearch インスタンスは、同じリージョンにある必要があります。
-
OSS の辞書ファイルは自動的に同期されません。ソースファイルが変更された場合は、辞書を更新して変更を適用してください。
-
説明-
複数の辞書ファイルをアップロードできます。ファイル名は
.dicで終わる必要があります。ファイル名には英字、数字、アンダースコアを使用でき、30 文字以内にする必要があります。 -
アップロード済みの辞書ファイルを変更するには、ファイルの横にある
アイコンをクリックしてダウンロードし、編集します。その後、元のファイルを削除して更新後のファイルを再アップロードします。元のファイルを削除した後に Save をクリックしてください。そうしないと、同じ名前のファイルが既に存在するというエラーが表示されます。
-
-
OK をクリックし、Elasticsearch ノードが辞書のロードを完了するまで待ちます。
Elasticsearch ノードは辞書ファイルを自動的にロードします。ロード時間はノードによって異なります。すべてのノードが完了するまで待ってください。
-
-
(任意)辞書の更新が反映されたかどうかを確認します。
-
Kibana コンソールにログインします。
-
左上の
アイコンをクリックし、 を選択してコードエディターを開きます。次のコードを実行して、入力テキスト
Chinese character input method for computersを粗い粒度で形態素解析します。説明実際の運用では、
textの値を辞書内の単語に置き換えてください。GET _analyze { "analyzer": "ik_smart", "text": "Chinese character input method for computers" }想定されるレスポンスは次のとおりです:
{ "tokens" : [ { "token" : "chinese", "start_offset" : 0, "end_offset" : 7, "type" : "ENGLISH", "position" : 0 }, { "token" : "character", "start_offset" : 8, "end_offset" : 17, "type" : "ENGLISH", "position" : 1 }, { "token" : "input", "start_offset" : 18, "end_offset" : 23, "type" : "ENGLISH", "position" : 2 }, { "token" : "method", "start_offset" : 24, "end_offset" : 30, "type" : "ENGLISH", "position" : 3 }, { "token" : "for", "start_offset" : 31, "end_offset" : 34, "type" : "ENGLISH", "position" : 4 }, { "token" : "computers", "start_offset" : 35, "end_offset" : 44, "type" : "ENGLISH", "position" : 5 } ] }
-
IK アナライザープラグインの使用
IK トークナイザーと Pinyin フィルターを使用してテキストをトークン化します。
-
ES インスタンスの Kibana 開発ツールページに移動します。
-
Kibana コンソールにログインします。
-
左上隅の
アイコンをクリックし、 を選択してコードエディタを開きます。
-
-
インデックスを作成し、IK トークナイザーと Pinyin フィルターを設定します。
次のコマンドを実行して、カスタムの
ik_pinyin_analyzerを使用するik_pinyinインデックスを作成します。このアナライザーは、ik_max_wordによるトークン化と Pinyin フィルターを使用して、中国語の用語を Pinyin に変換します。説明Pinyin フィルターは、中国語のトークン化が完了した後にトークンを Pinyin に変換します。
PUT ik_pinyin { "settings":{ "analysis": { "filter": { "my_pinyin" : { "type" : "pinyin", "keep_separate_first_letter" : false, "keep_full_pinyin" : true, "keep_original" : true, "limit_first_letter_length" : 16, "lowercase" : true, "remove_duplicated_term" : true } }, "analyzer": { "ik_pinyin_analyzer": { "type": "custom", "tokenizer": "ik_max_word", "filter": ["my_pinyin"] } } } }, "mappings":{ "properties":{ "text":{ "type" : "text", "analyzer" : "ik_pinyin_analyzer" } } } }主なパラメーターについて以下に説明します。
-
Pinyin フィルター (
filter)説明利用可能なすべてのパラメーターは、Pinyin Analysis for Elasticsearch に記載されています。
パラメーター
説明
my_pinyin
カスタム Pinyin フィルターの名前です。
type
Pinyin フィルターを使用するには、
pinyinに設定します。keep_separate_first_letter
各文字の頭文字トークンを除外するには、
falseに設定します。keep_full_pinyin
完全なピンイン形式を含めるには、
trueに設定します。keep_original
trueに設定すると、元の入力テキストが保持されます。limit_first_letter_length
頭文字のシーケンスを 16 文字に制限するには、
16に設定します。lowercase
trueに設定すると、ピンインが小文字で出力されます。remove_duplicated_term
trueに設定すると、"zh, zh"のような重複する用語が削除されます。 -
アナライザー (
analyzer):パラメーター
説明
ik_pinyin_analyzer
カスタムアナライザーの名前です。
type
カスタムアナライザーを定義するには、
customに設定します。tokenizer
テキストを最も細かい粒度で分割するには、
ik_max_wordに設定します。filter
my_pinyinPinyin フィルターを適用するには、my_pinyinに設定します。成功した場合、次のような結果が返されます。
{ "acknowledged": true, "shards_acknowledged": true, "index": "ik_pinyin" }
-
-
トークン化の結果を確認します。
次のコードを実行すると、入力テキスト
This is a testがトークン化されます。GET ik_pinyin/_analyze { "text": "这是一个测试", "analyzer": "ik_pinyin_analyzer" }次のようなレスポンスが返されます。
{ "tokens" : [ { "token" : "zhe", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 0 }, { "token" : "这是", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 0 }, { "token" : "zs", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 0 }, { "token" : "shi", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 1 }, { "token" : "ge", "start_offset" : 2, "end_offset" : 3, "type" : "CN_CHAR", "position" : 2 }, { "token" : "一个", "start_offset" : 2, "end_offset" : 3, "type" : "CN_CHAR", "position" : 2 }, { "token" : "g", "start_offset" : 2, "end_offset" : 3, "type" : "CN_CHAR", "position" : 2 }, { "token" : "ce", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 3 }, { "token" : "shi", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 4 }, { "token" : "测试", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 4 }, { "token" : "cs", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 4 } ] }
英数字混合語のトークン化を最適化
ik_max_word トークナイザーを使用すると、fawjh6bcm のような英数字が混在した文字列は、検索用に効果的にトークン化されない場合があります。再現率を向上させるには、enable_single_word を true に設定します。これにより、混在した単語が 1 文字のトークンに分割され、文字レベルのマッチングが可能になります。
次の例では、enable_single_word を有効にしたカスタムアナライザーを作成します。
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"ik_single_char_analyzer": {
"type": "custom",
"tokenizer": "my_ik_tokenizer"
}
},
"tokenizer": {
"my_ik_tokenizer": {
"type": "ik_max_word",
"enable_single_word": true
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "ik_single_char_analyzer"
}
}
}
}
|
パラメーター |
説明 |
|
enable_single_word |
|
このパラメーターは、 Alibaba Cloud Elasticsearch Serverless 環境でもサポートされています。
中国語と英語の混合検索に n-gram トークナイザーを使用
中国語テキストと混在する、jh6bcm のような連結された英字の型番を検索する場合、IK アナライザーだけでは部分一致に効果的なトークンを生成できないことがあります。この場合は、ngram トークナイザーを使用して IK アナライザーを補完または置換します。
n-gram トークナイザーは、テキストを設定可能な長さの連続した文字列に分割することで、部分文字列マッチングを可能にします。
次の例では、n-gram トークナイザーを使用するインデックスを作成します。
PUT my_ngram_index
{
"settings": {
"analysis": {
"tokenizer": {
"my_ngram_tokenizer": {
"type": "ngram",
"min_gram": 2,
"max_gram": 3,
"token_chars": ["letter", "digit"]
}
},
"analyzer": {
"ngram_analyzer": {
"type": "custom",
"tokenizer": "my_ngram_tokenizer"
}
}
}
},
"mappings": {
"properties": {
"model_number": {
"type": "text",
"analyzer": "ngram_analyzer"
}
}
}
}
|
パラメーター |
説明 |
|
min_gram |
グラムの最小文字数です。デフォルト: |
|
max_gram |
グラムの最大文字数。デフォルト: |
|
token_chars |
トークンに含める文字クラス。有効な値は |
n-gram トークナイザーの設定の詳細については、 「Ngram tokenizer」 をご参照ください。
よくある質問
同義語ファイルに大文字が含まれているとエラーになります。どうすればよいですか?
IK アナライザーは、同義語ファイルの処理時に大文字と小文字を区別します。同義語ファイルに大文字の単語 (例:IT) が含まれている場合、インデックス作成中に解析エラーが発生することがあります。
この問題は、次のいずれかの方法で解決できます:
-
すべての同義語を小文字に変換する:同義語ファイルを編集し、アップロードする前にすべてのエントリを小文字に変換してください。
-
アナライザーに lowercase フィルターを追加する:同義語マッチングの前にテキストを正規化するため、アナライザー設定のフィルターチェーンで synonym フィルターの前に
lowercaseフィルターを追加してください。例:PUT my_index { "settings": { "analysis": { "filter": { "my_synonym_filter": { "type": "synonym", "synonyms_path": "your_synonyms.txt" } }, "analyzer": { "ik_synonym_analyzer": { "type": "custom", "tokenizer": "ik_max_word", "filter": ["lowercase", "my_synonym_filter"] } } } } }重要lowercaseフィルターは、同義語のマッチングが行われる前にテキストが小文字に変換されるように、フィルターチェーン内で synonym フィルターより前に配置する必要があります。
参考
-
IK 辞書のホットアップデート用 API:UpdateHotIkDicts
-
IK 辞書のコールドアップデート用 API:UpdateDict