同義語トークンフィルター
synonym
トークンフィルターは、分析プロセス中に 同義語 を簡単に処理できるようにします。
同義語セットの定義
同義語セットの同義語は、同義語ルールを使用して定義されます。各同義語ルールには、同義語である単語が含まれています。
同義語ルールを定義するために、Solr形式とWordNet形式の2つの形式を使用できます。
Solr形式
この形式は、2つの異なる定義を使用します:
- 同等の同義語:同等の単語のグループを定義します。単語はカンマで区切られます。例:
同義語
ipod, i-pod, i pod
computer, pc, laptop
- 明示的な同義語:単語のグループを他の単語に一致させます。ルール定義の左側にある単語は、右側に記載されたすべての可能性に展開されます。例:
同義語
personal computer => pc
sea biscuit, sea biscit => seabiscuit
WordNet形式
WordNetは、複数行にわたる同義語セットを定義します。各行には、次の情報が含まれます:
- 同義語セットの数値識別子
- 同義語セット内の同義語の順序
- 同義語の単語
- 単語のタイプ識別子:名詞 (n)、動詞 (v)、形容詞 (a)、または副詞 (b)。
- 同義語ネット内の単語の深さ
次の例は、「come」、「advance」、「approach」の単語の同義語セットを定義します:
同義語
s(100000002,1,'come',v,1,0).
s(100000002,2,'advance',v,1,0).
s(100000002,3,'approach',v,1,0).""";
同義語セットの構成
同義語は、同義語API、同義語ファイル、またはトークンフィルター設定に直接インラインで構成できます。各オプションの詳細については、同義語セットを保存するを参照してください。
synonyms_set
構成オプションを使用して、同義語管理APIを介して作成された同義語セットを提供します:
JSON
"filter": {
"synonyms_filter": {
"type": "synonym",
"synonyms_set": "my-synonym-set",
"updateable": true
}
}
同義語セットは、インデックスに追加される前に存在する必要があります。存在しない同義語セットを参照してインデックスが作成されると、インデックスは部分的に作成され、操作不能な状態のままになります。このシナリオから回復する唯一の方法は、同義語セットが存在することを確認し、その後インデックスを削除して再作成するか、インデックスを閉じて再オープンすることです。
synonyms_path
を使用して同義語ファイルを提供します:
JSON
"filter": {
"synonyms_filter": {
"type": "synonym",
"synonyms_path": "analysis/synonym-set.txt"
}
}
上記は、synonym
フィルターを構成し、analysis/synonym-set.txt
のパスを持ちます(config
の場所に対して相対的)。
synonyms
を使用してインライン同義語を定義します:
JSON
"filter": {
"synonyms_filter": {
"type": "synonym",
"synonyms": ["pc => personal computer", "computer, pc, laptop"]
}
}
追加の設定は次のとおりです:
updateable
(デフォルトはfalse
)。true
が リロード を許可し、検索アナライザーが同義語ファイルの変更を取得します。検索アナライザー専用です。expand
(デフォルトはtrue
)。同等の同義語ルールの定義を展開します。同等の同義語を展開するを参照してください。lenient
(デフォルトはfalse
)。true
が同義語設定の解析中にエラーを無視します。解析できない同義語ルールのみが無視されることに注意してください。同義語とストップトークンフィルターの例を参照してください。
同等の同義語ルールを展開する
expand
パラメータは、同等の同義語ルールを展開するかどうかを制御します。次のように定義された同義語を考えてみてください:
foo, bar, baz
expand: true
を使用すると、同義語ルールは次のように展開されます:
foo => foo
foo => bar
foo => baz
bar => foo
bar => bar
bar => baz
baz => foo
baz => bar
baz => baz
expand
が false
に設定されている場合、同義語ルールは展開されず、最初の同義語が標準的な表現として扱われます。同義語は次のようになります:
foo => foo
bar => foo
baz => foo
expand
パラメータは、foo, bar => baz
のような明示的な同義語ルールには影響しません。
トークナイザーとignore_caseは非推奨
tokenizer
パラメータは、同義語をトークン化するために使用されるトークナイザーを制御します。このパラメータは、6.0以前に作成されたインデックスの後方互換性のためのものです。ignore_case
パラメータは、tokenizer
パラメータとのみ機能します。
同義語トークンフィルターを使用してアナライザーを構成する
同義語を適用するには、アナライザーに同義語トークンフィルターを含める必要があります:
JSON
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ["stemmer", "synonym"]
}
}
トークンフィルターの順序
順序はトークンフィルターにとって重要です。テキストは、同義語フィルターの前にあるフィルターを通過して処理され、その後同義語フィルターによって処理されます。
Elasticsearchは、同義語ファイルまたは同義語セット内のエントリを解析するために、同義語フィルターの前にあるトークンフィルターも使用します。上記の例では、同義語トークンフィルターはステマーの後に配置されています。ステマーは同義語エントリにも適用されます。
同義語マップ内のエントリはスタック位置を持つことができないため、一部のトークンフィルターはここで問題を引き起こす可能性があります。トークンの複数のバージョンを生成するトークンフィルターは、同義語を解析する際にどのバージョンのトークンを出力するかを選択できます。たとえば、asciifolding
はトークンの折りたたまれたバージョンのみを生成します。他のもの、multiplexer
、word_delimiter_graph
、または ngram
はエラーをスローします。
マルチトークンフィルターと同義語フィルターの両方を含むアナライザーを構築する必要がある場合は、マルチプレクサフィルターを使用し、マルチトークンフィルターを1つのブランチに、同義語フィルターを別のブランチに配置することを検討してください。
同義語とストップトークンフィルター
同義語とストップトークンフィルターは、次のように相互作用します。
同義語トークンフィルターの前のストップトークンフィルター
ストップワードは同義語ルール定義から削除されます。これにより、同義語ルールにエラーが発生する可能性があります。
無効な同義語ルールは、アナライザーの変更を適用する際にエラーを引き起こす可能性があります。リロード可能なアナライザーの場合、これによりリロードと変更の適用が妨げられます。同義語ルールのエラーを修正し、アナライザーをリロードする必要があります。
無効な同義語ルールを持つインデックスは再オープンできず、次のような場合に操作不能になります:
- インデックスを含むノードが起動する
- インデックスが閉じた状態からオープンされる
- ノードの再起動が発生する(これにより、ノードに割り当てられたシャードが再オープンされる)
明示的な同義語ルールの例として、foo, bar => baz
があり、ストップフィルターが bar
を削除します:
lenient
がfalse
に設定されている場合、bar
が同義語ルールの左側から削除されるため、エラーが発生します。lenient
がtrue
に設定されている場合、ルールfoo => baz
が追加され、bar => baz
は無視されます。
ストップフィルターが baz
を削除した場合:
lenient
がfalse
に設定されている場合、baz
が同義語ルールの右側から削除されるため、エラーが発生します。lenient
がtrue
に設定されている場合、ターゲット単語が削除されるため、同義語は効果がありません。
同等の同義語ルールの例として、foo, bar, baz
と expand: true, with a stop filter that removes `bar
があります:
lenient
がfalse
に設定されている場合、bar
が同義語ルールから削除されるため、エラーが発生します。lenient
がtrue
に設定されている場合、追加された同義語は、削除された単語を含まない次の同義語ルールに相当します:
foo => foo
foo => baz
baz => foo
baz => baz
同義語トークンフィルターの後のストップトークンフィルター
ストップフィルターは、結果の同義語展開から用語を削除します。
たとえば、foo, bar => baz
のような同義語ルールと、baz
を削除するストップフィルターは、foo
または bar
に対して一致しません。両方とも baz
に展開され、ストップフィルターによって削除されます。
ストップフィルターが foo
を削除した場合、foo
を検索すると baz
に展開され、ストップフィルターによって削除されないため、baz
に対して一致する可能性があります。