同義語トークンフィルター

synonym トークンフィルターは、分析プロセス中に 同義語 を簡単に処理できるようにします。

同義語セットの定義

同義語セットの同義語は、同義語ルールを使用して定義されます。各同義語ルールには、同義語である単語が含まれています。

同義語ルールを定義するために、Solr形式とWordNet形式の2つの形式を使用できます。

Solr形式

この形式は、2つの異なる定義を使用します:

  • 同等の同義語:同等の単語のグループを定義します。単語はカンマで区切られます。例:

同義語

  1. ipod, i-pod, i pod
  2. computer, pc, laptop
  • 明示的な同義語:単語のグループを他の単語に一致させます。ルール定義の左側にある単語は、右側に記載されたすべての可能性に展開されます。例:

同義語

  1. personal computer => pc
  2. sea biscuit, sea biscit => seabiscuit

WordNet形式

WordNetは、複数行にわたる同義語セットを定義します。各行には、次の情報が含まれます:

  • 同義語セットの数値識別子
  • 同義語セット内の同義語の順序
  • 同義語の単語
  • 単語のタイプ識別子:名詞 (n)、動詞 (v)、形容詞 (a)、または副詞 (b)。
  • 同義語ネット内の単語の深さ

次の例は、「come」、「advance」、「approach」の単語の同義語セットを定義します:

同義語

  1. s(100000002,1,'come',v,1,0).
  2. s(100000002,2,'advance',v,1,0).
  3. s(100000002,3,'approach',v,1,0).""";

同義語セットの構成

同義語は、同義語API同義語ファイル、またはトークンフィルター設定に直接インラインで構成できます。各オプションの詳細については、同義語セットを保存するを参照してください。

synonyms_set 構成オプションを使用して、同義語管理APIを介して作成された同義語セットを提供します:

JSON

  1. "filter": {
  2. "synonyms_filter": {
  3. "type": "synonym",
  4. "synonyms_set": "my-synonym-set",
  5. "updateable": true
  6. }
  7. }

同義語セットは、インデックスに追加される前に存在する必要があります。存在しない同義語セットを参照してインデックスが作成されると、インデックスは部分的に作成され、操作不能な状態のままになります。このシナリオから回復する唯一の方法は、同義語セットが存在することを確認し、その後インデックスを削除して再作成するか、インデックスを閉じて再オープンすることです。

synonyms_path を使用して同義語ファイルを提供します:

JSON

  1. "filter": {
  2. "synonyms_filter": {
  3. "type": "synonym",
  4. "synonyms_path": "analysis/synonym-set.txt"
  5. }
  6. }

上記は、synonym フィルターを構成し、analysis/synonym-set.txt のパスを持ちます(config の場所に対して相対的)。

synonyms を使用してインライン同義語を定義します:

JSON

  1. "filter": {
  2. "synonyms_filter": {
  3. "type": "synonym",
  4. "synonyms": ["pc => personal computer", "computer, pc, laptop"]
  5. }
  6. }

追加の設定は次のとおりです:

  • updateable(デフォルトは false)。trueリロード を許可し、検索アナライザーが同義語ファイルの変更を取得します。検索アナライザー専用です。
  • expand(デフォルトは true)。同等の同義語ルールの定義を展開します。同等の同義語を展開するを参照してください。
  • lenient(デフォルトは false)。true が同義語設定の解析中にエラーを無視します。解析できない同義語ルールのみが無視されることに注意してください。同義語とストップトークンフィルターの例を参照してください。

同等の同義語ルールを展開する

expand パラメータは、同等の同義語ルールを展開するかどうかを制御します。次のように定義された同義語を考えてみてください:

foo, bar, baz

expand: true を使用すると、同義語ルールは次のように展開されます:

  1. foo => foo
  2. foo => bar
  3. foo => baz
  4. bar => foo
  5. bar => bar
  6. bar => baz
  7. baz => foo
  8. baz => bar
  9. baz => baz

expandfalse に設定されている場合、同義語ルールは展開されず、最初の同義語が標準的な表現として扱われます。同義語は次のようになります:

  1. foo => foo
  2. bar => foo
  3. baz => foo

expand パラメータは、foo, bar => baz のような明示的な同義語ルールには影響しません。

トークナイザーとignore_caseは非推奨

tokenizer パラメータは、同義語をトークン化するために使用されるトークナイザーを制御します。このパラメータは、6.0以前に作成されたインデックスの後方互換性のためのものです。ignore_case パラメータは、tokenizer パラメータとのみ機能します。

同義語トークンフィルターを使用してアナライザーを構成する

同義語を適用するには、アナライザーに同義語トークンフィルターを含める必要があります:

JSON

  1. "analyzer": {
  2. "my_analyzer": {
  3. "type": "custom",
  4. "tokenizer": "standard",
  5. "filter": ["stemmer", "synonym"]
  6. }
  7. }

トークンフィルターの順序

順序はトークンフィルターにとって重要です。テキストは、同義語フィルターの前にあるフィルターを通過して処理され、その後同義語フィルターによって処理されます。

Elasticsearchは、同義語ファイルまたは同義語セット内のエントリを解析するために、同義語フィルターの前にあるトークンフィルターも使用します。上記の例では、同義語トークンフィルターはステマーの後に配置されています。ステマーは同義語エントリにも適用されます。

同義語マップ内のエントリはスタック位置を持つことができないため、一部のトークンフィルターはここで問題を引き起こす可能性があります。トークンの複数のバージョンを生成するトークンフィルターは、同義語を解析する際にどのバージョンのトークンを出力するかを選択できます。たとえば、asciifolding はトークンの折りたたまれたバージョンのみを生成します。他のもの、multiplexerword_delimiter_graph、または ngram はエラーをスローします。

マルチトークンフィルターと同義語フィルターの両方を含むアナライザーを構築する必要がある場合は、マルチプレクサフィルターを使用し、マルチトークンフィルターを1つのブランチに、同義語フィルターを別のブランチに配置することを検討してください。

同義語とストップトークンフィルター

同義語とストップトークンフィルターは、次のように相互作用します。

同義語トークンフィルターの前のストップトークンフィルター

ストップワードは同義語ルール定義から削除されます。これにより、同義語ルールにエラーが発生する可能性があります。

無効な同義語ルールは、アナライザーの変更を適用する際にエラーを引き起こす可能性があります。リロード可能なアナライザーの場合、これによりリロードと変更の適用が妨げられます。同義語ルールのエラーを修正し、アナライザーをリロードする必要があります。

無効な同義語ルールを持つインデックスは再オープンできず、次のような場合に操作不能になります:

  • インデックスを含むノードが起動する
  • インデックスが閉じた状態からオープンされる
  • ノードの再起動が発生する(これにより、ノードに割り当てられたシャードが再オープンされる)

明示的な同義語ルールの例として、foo, bar => baz があり、ストップフィルターが bar を削除します:

  • lenientfalse に設定されている場合、bar が同義語ルールの左側から削除されるため、エラーが発生します。
  • lenienttrue に設定されている場合、ルール foo => baz が追加され、bar => baz は無視されます。

ストップフィルターが baz を削除した場合:

  • lenientfalse に設定されている場合、baz が同義語ルールの右側から削除されるため、エラーが発生します。
  • lenienttrue に設定されている場合、ターゲット単語が削除されるため、同義語は効果がありません。

同等の同義語ルールの例として、foo, bar, bazexpand: true, with a stop filter that removes `bar があります:

  • lenientfalse に設定されている場合、bar が同義語ルールから削除されるため、エラーが発生します。
  • lenienttrue に設定されている場合、追加された同義語は、削除された単語を含まない次の同義語ルールに相当します:
  1. foo => foo
  2. foo => baz
  3. baz => foo
  4. baz => baz

同義語トークンフィルターの後のストップトークンフィルター

ストップフィルターは、結果の同義語展開から用語を削除します。

たとえば、foo, bar => baz のような同義語ルールと、baz を削除するストップフィルターは、foo または bar に対して一致しません。両方とも baz に展開され、ストップフィルターによって削除されます。

ストップフィルターが foo を削除した場合、foo を検索すると baz に展開され、ストップフィルターによって削除されないため、baz に対して一致する可能性があります。