IK アナライザープラグイン (analysis-ik) は、Alibaba Cloud Elasticsearch (ES) 向けの中国語テキスト形態素解析拡張機能であり、複数の組み込み辞書タイプを備えています。辞書をカスタマイズまたは拡張して形態素解析の精度を向上させ、Object Storage Service (OSS) から辞書ファイルを動的に読み込んでリモート管理することができます。
背景情報
IK アナライザープラグインは、トークナイザー、辞書ファイル、更新メカニズムの 3 つのコンポーネントで構成されています。
IK アナライザープラグインのバージョンは、Elasticsearch クラスターのバージョンと一致する必要があります。たとえば、クラスターがバージョン 8.17 を使用している場合、IK アナライザープラグインもバージョン 8.17 です。
トークナイザー:中国語テキストを意味のあるターム (トークン) に分割し、形態素解析の粒度を決定します。
辞書ファイル:語彙の基盤を提供します。トークナイザーは、これらのファイルに基づいて分割を行い、カスタマイズと拡張をサポートします。
辞書更新方法:コールドアップデートとホットアップデートの両方をサポートし、ビジネス要件に合わせて辞書を柔軟に調整できます。
形態素解析ルール
IK アナライザーは、2 つの形態素解析ルールをサポートしています。
ik_max_word: 最も細かい粒度でテキストを分割し、単語ベースのクエリに最適です。
ik_smart: テキストをより粗い粒度で分割し、フレーズベースのクエリに最適です。
辞書タイプ
IK アナライザーは、以下の辞書タイプをサポートしています。
辞書タイプ | 説明 | ファイル要件 | サポートされる更新方法 |
メイン辞書 | デフォルトのメイン辞書は ES インデックスにメイン辞書を指定すると、クラスターはインデックス作成時に受信データをこの辞書と照合します。一致したタームは、対応するキーワードで検索可能になります。 | 1行に1単語で、 | |
ストップワード辞書 | デフォルトのストップワード辞書は ES インデックスにストップワード辞書を指定すると、クラスターはインデックス作成時に一致したタームを除外します。除外されたタームは転置インデックスに表示されません。 | ||
前置詞辞書 | デフォルトの前置詞辞書は | 該当なし | |
量詞辞書 | デフォルトの数量詞辞書は | ||
suffix.dic | 接尾辞タームを格納し、トークナイザーが接尾辞を含む単語を分割するのに役立ちます。 | 該当なし | 更新はサポートされていません |
surname.dic | 一般的な中国語の姓を格納し、トークナイザーが名前を認識するのに役立ちます。 |
辞書更新方法
デフォルトがニーズに合わない場合は、辞書を更新します。IK アナライザーは、以下の方法をサポートしています。
更新方法 | 説明 | シナリオ |
ES クラスターを再起動して、すべてのノードに辞書の変更を適用します。 システムは、アップロードされたファイルをすべての ES ノードに配信し、再起動します。変更は再起動後に有効になります。 |
| |
説明 メイン辞書またはストップワード辞書の更新のみをサポートします。 重要 初回のホットアップデート設定時、または辞書ファイルリストの変更時 (辞書ファイルの追加、削除、名前変更) には、クラスターが再起動します。その後、ファイル名が変更されていない既存の辞書ファイルのコンテンツのみを変更する場合は、再起動なしで動的に有効になります。ビジネスへの影響を避けるため、これらの操作はオフピーク時に実行してください。 |
|
前提条件
インスタンスが正常状態であること。 インスタンスのステータスを確認して、詳細ページで確認してください。
説明このトピックでは、Alibaba Cloud ES インスタンスのバージョン
7.10.0を使用します。 コンソールインターフェイスと機能は、バージョンによって異なる場合があります。(オプション) 辞書を更新する予定がある場合は、まず以下の手順を完了してください。
[OSS ファイルのアップロード]を使用して更新する場合: まず OSS バケットを作成し、必要な辞書ファイルをアップロードしてください。
[ローカルファイルのアップロード]を使用して更新する場合: 必要な辞書ファイルをローカルマシンに保存してください。
IK 辞書の更新
デフォルトがニーズに合わない場合は、IK 辞書を更新します。続行する前に、更新方法を確認してください。IK 形態素解析がすでに設定されているインデックスの場合、辞書の更新は新しいデータ (新しく追加または更新されたドキュメント) にのみ適用されます。既存のすべてのデータに変更を適用するには、インデックスを再作成してください。
コールドアップデート
コールドアップデートを実行するには、次の手順を実行します。
コールドアップデートはクラスターを再起動します。オフピーク時に実行してください。
インスタンスの詳細ページに移動します。
Alibaba Cloud Elasticsearch コンソールにログオンします。
左側のナビゲーションペインで、Elasticsearch クラスター をクリックします。
上部のメニューバーで、リソースグループとリージョンを選択します。
Elasticsearch インスタンスリストで、対象のインスタンス ID をクリックして、詳細ページに移動します。
analysis-ikプラグインのコールドアップデートページに移動します。左側のナビゲーションペインで、を選択します。
ビルトインプラグインリスト タブで、
analysis-ikプラグインを見つけ、アクション 列にある 標準アップグレード をクリックします。
コールドアップデートを実行します。
IK 辞書設定 - コールドパッチ ダイアログボックスで、対象の辞書の横にある 編集 をクリックし、指示に従って必要な辞書ファイルをアップロードしてから、保存 をクリックします。
辞書ファイルは、以下のいずれかの方法でアップロードできます。
[ローカルファイルのアップロード]:
アイコンをクリックするか、指示に従ってローカルファイルをドラッグ & ドロップします。[OSS ファイルのアップロード]: バケット名と辞書ファイル名を入力し、追加 をクリックします。
バケットと Alibaba Cloud ES インスタンスは、同じリージョンにある必要があります。
OSS 辞書ファイルは自動的に同期されません。ソースファイルが変更された場合は、辞書更新を実行して変更を適用してください。
説明各辞書タイプは、
DIC形式のファイルを 1 つのみサポートします。アップロードされたファイルは、元の辞書を置き換えます。辞書ファイル名は
.dicで終わる必要があります。ファイル名には、英字、数字、およびアンダースコアを含めることができ、文字数は 30 文字を超えてはなりません。辞書をデフォルトのファイルに復元するには、デフォルトのファイルをダウンロードして再アップロードしてください。デフォルトの辞書ファイルは、以下のリンクから入手できます。
リスクの確認を選択し、OK をクリックしてインスタンスを再起動します。
インスタンスが再起動すると、辞書の更新が完了します。
(オプション) 辞書の更新が有効になったかどうかをテストします。
左上隅にある
アイコンをクリックし、 を選択してコードエディターを開きます。次のコードを実行して、入力テキスト
Chinese character input method for computersを粗粒度にトークン化します。説明実際には、
textの値を辞書の単語に置き換えます。GET _analyze { "analyzer": "ik_smart", "text": "计算机汉字输入方法" }期待される応答は次のとおりです。
{ "tokens" : [ { "token" : "计算机", "start_offset" : 0, "end_offset" : 3, "type" : "CN_WORD", "position" : 0 }, { "token" : "汉字输入", "start_offset" : 3, "end_offset" : 7, "type" : "CN_WORD", "position" : 1 }, { "token" : "方法", "start_offset" : 7, "end_offset" : 9, "type" : "CN_WORD", "position" : 2 } ] }
ホットアップデート
ホットアップデートを実行するには、次の手順を実行します。
ファイル名が変更されていない既存の辞書ファイルのコンテンツのみを変更する場合、クラスターは再起動しません。辞書ファイル名またはファイル数が変更された場合、または初回のホットアップデート設定の場合、クラスターは再起動します。ビジネスへの影響を避けるため、この操作はオフピーク時に実行してください。再起動後、辞書は自動的に有効になります。
インスタンスの詳細ページに移動します。
Alibaba Cloud Elasticsearch コンソールにログオンします。
左側のナビゲーションペインで、Elasticsearch クラスター をクリックします。
上部のメニューバーで、リソースグループとリージョンを選択します。
Elasticsearch インスタンスリストで、対象のインスタンス ID をクリックして、詳細ページに移動します。
analysis-ikプラグインのホットアップデートページに移動します。左側のナビゲーションペインで、を選択します。
ビルトインプラグインリスト タブで、
analysis-ikプラグインを見つけ、アクション 列の ローリングアップグレード をクリックします。
ホットアップデートを実行します。
IK 辞書設定 - ホットパッチ ダイアログボックスで、対象の辞書の横にある 編集 をクリックし、指示に従って必要な辞書ファイルをアップロードした後、保存 をクリックします。
辞書ファイルは、以下のいずれかの方法でアップロードできます。
[ローカルファイルのアップロード]:
アイコンをクリックするか、指示に従ってローカルファイルをドラッグ & ドロップします。[OSS ファイルのアップロード]: バケット名と辞書ファイル名を入力し、追加 をクリックします。
バケットと Alibaba Cloud ES インスタンスは、同じリージョンにある必要があります。
OSS 辞書ファイルは自動的に同期されません。ソースファイルが変更された場合は、辞書更新を実行して変更を適用してください。
説明複数の辞書ファイルをアップロードできます。ファイル名は
.dicで終わる必要があります。ファイル名には英字、数字、アンダースコアを使用でき、文字数は 30 文字以内にする必要があります。アップロード済みの辞書ファイルを変更するには、その横にある
アイコンをクリックしてファイルをダウンロードし、編集します。次に、元のファイルを削除し、更新したファイルを再アップロードします。元のファイルを削除した後、Save をクリックします。そうしないと、システムによって同じ名前のファイルがすでに存在すると報告されます。
OK をクリックし、ES ノードが辞書の読み込みを完了するまで待ちます。
ES ノードは辞書ファイルを自動的に読み込みます。各ノードは、それぞれ異なるタイミングで辞書を読み込みます。すべてのノードが完了するまで待ってください。
(オプション) 辞書の更新が有効になったかどうかをテストします。
左上隅にある
アイコンをクリックし、 を選択してコードエディターを開きます。次のコードを実行して、入力テキスト
Chinese character input method for computersを粗粒度にトークン化します。説明実際には、
textの値を辞書の単語に置き換えます。GET _analyze { "analyzer": "ik_smart", "text": "计算机汉字输入方法" }期待される応答は次のとおりです。
{ "tokens" : [ { "token" : "计算机", "start_offset" : 0, "end_offset" : 3, "type" : "CN_WORD", "position" : 0 }, { "token" : "汉字输入", "start_offset" : 3, "end_offset" : 7, "type" : "CN_WORD", "position" : 1 }, { "token" : "方法", "start_offset" : 7, "end_offset" : 9, "type" : "CN_WORD", "position" : 2 } ] }
IK アナライザープラグインの使用
IK トークナイザーと Pinyin フィルターを使用してテキストを形態素解析します。
ES インスタンスの Kibana 開発ツールページに移動します。
左上隅の
アイコンをクリックし、 を選択してコードエディターを開きます。
インデックスを作成し、IK トークナイザーと Pinyin フィルターを設定します。
次のコマンドを実行し、
ik_max_wordトークン化と Pinyin フィルターで中国語を Pinyin に変換するカスタムik_pinyin_analyzerを使用して、ik_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" } } } }主要なパラメータについて、以下に説明します。
ピンインフィルター (
filter)説明使用可能なすべてのパラメータは、Pinyin Analysis for Elasticsearch に記載されています。
パラメータ
説明
my_pinyin
カスタム Pinyin フィルターの名前です。
type
pinyinに設定すると、Pinyin フィルターが指定されます。keep_separate_first_letter
falseに設定すると、各単語の頭文字が除外されます。keep_full_pinyin
完全な Pinyin 形式を含めるには、
trueに設定します。keep_original
trueに設定すると、元の入力テキストが保持されます。limit_first_letter_length
頭文字シーケンスを 16 文字に制限するには、
16に設定します。lowercase
trueに設定すると、Pinyin が小文字で出力されます。remove_duplicated_term
trueに設定すると、“zh,zh”のような重複する用語が削除されます。アナライザー (
analyzer):パラメータ
説明
ik_pinyin_analyzer
カスタムアナライザーの名前です。
type
カスタムアナライザーを定義するには、
customに設定します。tokenizer
ik_max_wordに設定すると、テキストが最も細かい粒度で分割されます。filter
my_pinyinPinyin フィルターを適用するには、my_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 フィルターを追加する: アナライザー設定でシノニムフィルターの前に
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フィルターをシノニムフィルターの前に配置する必要があります。
関連ドキュメント
IK 辞書のホットアップデート用 API: UpdateHotIkDicts
IK 辞書のコールドアップデート用 API: UpdateDict