同義語での検索

同義語とは、同じまたは類似の意味を持つ単語やフレーズのことです。これは検索の重要な側面であり、検索体験を向上させ、検索結果の範囲を広げることができます。

同義語を使用することで、

  • 検索の関連性を向上させることができ、同じ概念を表現するために異なる用語を使用する関連文書を見つけることができます。
  • ドメイン特有の語彙をよりユーザーフレンドリーにし、ユーザーがより馴染みのある検索用語を使用できるようにします。
  • 一般的な誤字やタイプミスを定義し、一般的な間違いを透明に処理します。

同義語は同義語セットを使用してグループ化されます。必要に応じて、同義語セットをいくつでも持つことができます。

Elasticsearchで同義語セットを使用するには、次の手順が必要です:

同義語セットを保存する

同義語セットはElasticsearchに保存する必要があり、アナライザーがそれを参照できるようにします。同義語セットを保存する方法は3つあります:

同義語API

同義語APIを使用して同義語セットを管理できます。これは最も柔軟なアプローチであり、同義語セットを動的に定義および変更できます。

同義語セットの変更は、自動的に関連するアナライザーを再読み込みします。

同義語ファイル

同義語セットをファイルに保存できます。

同義語セットファイルは、すべてのクラスター ノードにアップロードされ、Elasticsearch ディストリビューションの構成ディレクトリに配置する必要があります。Elasticsearch Serviceを使用している場合は、カスタムバンドルを使用して同義語ファイルをアップロードできます。

同義語ファイルの例:

同義語

  1. # 空白行と#で始まる行はコメントです。
  2. # 明示的なマッピングは「=>」の左側の任意のトークンシーケンスに一致します。
  3. # 右側のすべての代替品で置き換えます。
  4. # これらのタイプのマッピングは、スキーマ内のexpandパラメータを無視します。
  5. # 例:
  6. i-pod, i pod => ipod
  7. sea biscuit, sea biscit => seabiscuit
  8. # 同等の同義語はカンマで区切ることができ、
  9. # 明示的なマッピングはありません。この場合、マッピングの動作は
  10. # トークンフィルター構成のexpandパラメータから取得されます。
  11. # これにより、同じ同義語ファイルを異なる同義語処理戦略で使用できます。
  12. # 例:
  13. ipod, i-pod, i pod
  14. foozball , foosball
  15. universe , cosmos
  16. lol, laughing out loud
  17. # 同義語トークンフィルター構成でexpand==trueの場合、
  18. # "ipod, i-pod, i pod"は明示的なマッピングに相当します:
  19. ipod, i-pod, i pod => ipod, i-pod, i pod
  20. # expand==falseの場合、"ipod, i-pod, i pod"は次のように相当します
  21. # 明示的なマッピングに:
  22. ipod, i-pod, i pod => ipod
  23. # 複数の同義語マッピングエントリがマージされます。
  24. foo => foo bar
  25. foo => baz
  26. # は次のように相当します
  27. foo => foo bar, baz

既存の同義語セットを更新するには、新しいファイルをクラスターにアップロードします。同義語セットファイルは、すべてのクラスター ノードで同期を保つ必要があります。

同義語セットが更新されると、それを使用する検索アナライザーは、検索アナライザーを再読み込みするAPIを使用して更新する必要があります。

この手動での同期と再読み込みにより、このアプローチは、同義語APIを使用するよりも柔軟性が低くなります。

インライン

トークンフィルター定義に直接インラインで同義語を追加することで、同義語をテストできます。

インライン同義語は本番環境での使用は推奨されません。インライン同義語が多すぎると、クラスターのサイズが不必要に増加し、パフォーマンスの問題を引き起こす可能性があります。

同義語トークンフィルターとアナライザーを設定する

同義語セットが作成されたら、それを使用するためにトークンフィルターとアナライザーの設定を開始できます。

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

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

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

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

Elasticsearchは、分析プロセスの一部として同義語を使用します。次の2種類のトークンフィルターを使用して同義語を含めることができます:

  • 同義語グラフ:これは推奨されており、複数の単語の同義語(”hurriedly”、”in a hurry”)を正しく処理できます。
  • 同義語:複数の単語の同義語を使用する必要がある場合は推奨されません。

各同義語トークンフィルターのドキュメントを確認して、構成の詳細とアナライザーへの追加手順を確認してください。

アナライザーをテストする

インデックス設定を変更せずにアナライザー構成をテストできます。分析APIを使用して、アナライザー チェーンをテストします:

Python

  1. resp = client.indices.analyze(
  2. tokenizer="standard",
  3. filter=[
  4. "lowercase",
  5. {
  6. "type": "synonym_graph",
  7. "synonyms": [
  8. "pc => personal computer",
  9. "computer, pc, laptop"
  10. ]
  11. }
  12. ],
  13. text="Check how PC synonyms work",
  14. )
  15. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'standard',
  4. filter: [
  5. 'lowercase',
  6. {
  7. type: 'synonym_graph',
  8. synonyms: [
  9. 'pc => personal computer',
  10. 'computer, pc, laptop'
  11. ]
  12. }
  13. ],
  14. text: 'Check how PC synonyms work'
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "standard",
  3. filter: [
  4. "lowercase",
  5. {
  6. type: "synonym_graph",
  7. synonyms: ["pc => personal computer", "computer, pc, laptop"],
  8. },
  9. ],
  10. text: "Check how PC synonyms work",
  11. });
  12. console.log(response);

コンソール

  1. GET /_analyze
  2. {
  3. "tokenizer": "standard",
  4. "filter" : [
  5. "lowercase",
  6. {
  7. "type": "synonym_graph",
  8. "synonyms": ["pc => personal computer", "computer, pc, laptop"]
  9. }
  10. ],
  11. "text" : "Check how PC synonyms work"
  12. }

インデックスまたは検索時に同義語を適用する

アナライザーは、インデックス時または検索時に適用できます。

同義語を適用するタイミングを決定する必要があります:

  • インデックス時:同義語は、ドキュメントがElasticsearchにインデックスされるときに適用されます。これは柔軟性が低い代替手段であり、同義語の変更には再インデックスが必要です。
  • 検索時:同義語は、検索が実行されるときに適用されます。これはより柔軟なアプローチであり、再インデックスは必要ありません。トークンフィルターが"updateable": trueで構成されている場合、同義語を変更すると、検索アナライザーを再読み込みできます。

synonyms APIを使用して作成された同義語セットは、検索時にのみ使用できます。

同義語セットを含むアナライザーを検索時アナライザーまたはインデックス時アナライザーとして指定できます。

次の例では、my_analyzerをインデックスマッピングのtitleフィールドに検索アナライザーとして追加します:

JSON

  1. "mappings": {
  2. "properties": {
  3. "title": {
  4. "type": "text",
  5. "search_analyzer": "my_analyzer",
  6. "updateable": true
  7. }
  8. }
  9. }