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

synonym_graph トークンフィルターは、分析プロセス中にマルチワード同義語を正しく処理するために、同義語を簡単に扱うことができます。

マルチワード同義語を適切に処理するために、このトークンフィルターは処理中にグラフトークンストリームを作成します。このトピックとそのさまざまな複雑さについての詳細は、LuceneのTokenStreamsは実際にはグラフですのブログ投稿をお読みください。


このトークンフィルターは、検索アナライザーの一部としてのみ使用するように設計されています。インデックス作成中に同義語を適用したい場合は、標準のsynonym token filterを使用してください。

同義語セットの定義

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

同義語ルールを定義するために、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同義語ファイル、またはトークンフィルター構成内で直接inlinedすることによって構成できます。各オプションの詳細については、同義語セットを保存するを参照してください。

  1. #### JSON
  2. ``````JSON
  3. "filter": {
  4. "synonyms_filter": {
  5. "type": "synonym_graph",
  6. "synonyms_set": "my-synonym-set",
  7. "updateable": true
  8. }
  9. }
  10. `

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

  1. #### JSON
  2. ``````JSON
  3. "filter": {
  4. "synonyms_filter": {
  5. "type": "synonym_graph",
  6. "synonyms_path": "analysis/synonym-set.txt"
  7. }
  8. }
  9. `

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

  1. #### JSON
  2. ``````JSON
  3. "filter": {
  4. "synonyms_filter": {
  5. "type": "synonym_graph",
  6. "synonyms": ["pc => personal computer", "computer, pc, laptop"]
  7. }
  8. }
  9. `

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

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

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

  1. `````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
  1. ``````bash
  2. foo => foo
  3. bar => foo
  4. baz => foo
  5. `

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

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

  1. ## 同義語グラフトークンフィルターを使用してアナライザーを構成する
  2. 同義語を適用するには、アナライザーに同義語グラフトークンフィルターを含める必要があります:
  3. #### JSON
  4. ``````JSON
  5. "analyzer": {
  6. "my_analyzer": {
  7. "type": "custom",
  8. "tokenizer": "standard",
  9. "filter": ["stemmer", "synonym_graph"]
  10. }
  11. }
  12. `

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

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

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に対して一致する可能性があります。