マルチフィールド検索(1)-複数および単一のクエリー文字列

11007 ワード

マルチフィールド検索(Multifield Search)
本文は公式ガイドのMultifield Searchの章から翻訳した.
クエリーは、matchクエリーの句が1つしかないクエリーではありません.1つ以上のフィールドに対して同じまたは異なるクエリー文字列を使用して検索することがしばしば必要です.これは、複数のクエリー句とそれらが得た相関スコアを意味のある方法でマージする必要があることを意味します.
戦争と平和という本を探しているのかもしれませんが、その作者はLeo Tolstoyです.ESのドキュメントを検索するには、「最小一致(Minim Should Match)」を使用しているかもしれません.また、ジョンという名前でSmithという名前のユーザーを探すこともできます.
この章では、マルチフィールド検索を構築するツールと、実際の状況に基づいてどのシナリオを使用するかを決定する方法について説明します.
複数のクエリー文字列(Multiple Query Strings)
フィールドクエリーを処理する最も簡単な方法は、検索語を特定のフィールドに対応させることです.戦争と平和がタイトルであり、Leo Tolstoyが著者であることを知っていれば、各条件を単純にmatch句として、boolクエリーでマージすることができます.
GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title":  "War and Peace" }},
        { "match": { "author": "Leo Tolstoy"   }}
      ]
    }
  }
}
boolクエリは、「マッチングが多ければ多いほど良い(More-matches-is-better)」という方法を採用しているため、各match句のスコアが加算され、ドキュメントの最終的な_scoreが得られる.2つの句を一致させるドキュメントは、1つの句のみを一致させるドキュメントよりもスコアが高くなります.
もちろん、match句のみを使用するわけではありません.boolクエリーには、他のboolクエリーを含む他のタイプのクエリーが含まれます.希望する翻訳者を指定するために、句を追加できます.
GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title":  "War and Peace" }},
        { "match": { "author": "Leo Tolstoy"   }},
        { "bool":  {
          "should": [
            { "match": { "translator": "Constance Garnett" }},
            { "match": { "translator": "Louise Maude"      }}
          ]
        }}
      ]
    }
  }
}

なぜ、翻訳者のクエリー・句を別のboolクエリーに配置しますか?すべての4つのmatchクエリーはshouldサブステートメントですが、なぜ翻訳者のクエリーサブステートメントとタイトル、および著者のクエリーサブステートメントを同じ階層に置かないのでしょうか.
答えは、スコアがどのように計算されているかにあります.boolクエリは、各matchクエリを実行し、それらのスコアを加算し、一致するクエリ句の数を乗算し、最後にすべてのクエリ句の数で除算します.同じ階層の各句には同じ重みがあります.上記のクエリでは、boolクエリに含まれる翻訳者クエリ句は、合計スコア値の3分の1にすぎません.翻訳者クエリーの句をタイトルと著者と同じ階層に配置すると、タイトルと著者の句の重みが減り、それぞれ4分の1になります.
句の優先度の設定
上記のクエリの各句が3分の1を占める重みは、私たちが必要としないかもしれません.翻訳者フィールドよりも、タイトルと著者フィールドに興味があるかもしれません.クエリーを調整して、タイトルと作成者をより重要にします.
利用可能なすべての措置の中で、私たちが採用できる最も簡単な方法はboostパラメータです.titleおよびauthorフィールドの重みを増すために、1より大きいboost値を与えることができます.
GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { 
            "title":  {
              "query": "War and Peace",
              "boost": 2
        }}},
        { "match": { 
            "author":  {
              "query": "Leo Tolstoy",
              "boost": 2
        }}},
        { "bool":  { 
            "should": [
              { "match": { "translator": "Constance Garnett" }},
              { "match": { "translator": "Louise Maude"      }}
            ]
        }}
      ]
    }
  }
}

以上のtitleおよびkフィールドのboost値は2である.ネストされたboolクエリーのデフォルトboost値はkです.
試行錯誤(Trial and Error)により、「最適」のboost値を決定できます.boost値を設定し、テストクエリーを実行し、このプロセスを繰り返します.合理的なboost値の範囲は110の間であり、15である可能性もある.スコアが正規化されるため、それよりも高い値の影響は大きく作用しません.
単一クエリー文字列(Single Query String)boolクエリーは、マルチフィールドクエリーの中流砥石です.多くの場合、特に異なるクエリー文字列を異なるフィールドにマッピングできる場合によく機能します.
問題は、現在のユーザが、すべての検索語を1つの場所で入力し、アプリケーションが正しい結果を得る方法を知ることを望んでいることである.したがって、複数のフィールドを含む検索フォームをアドバンスド検索(Advanced Search)と呼ぶと、皮肉なことにいくつかの意味があります.高度な検索は、ユーザーにとってより高度に見えますが、実際にはより簡単に実現されます.
マルチワードの場合、マルチフィールドクエリには万能な方法はありません.最適な結果を得るには、データと適切なツールの使用方法を理解する必要があります.
あなたのデータを知る
ユーザーの唯一の入力がクエリー文字列である場合、次の3つのケースによく遭遇します.
最適フィールド(Best fields)
いくつかの概念を表す単語を検索すると、例えば「brown fox」というように、いくつかの単語が結合して表現される意味は、単独の単語よりも多くなります.titleやbodyのようなフィールドは、関連していますが、互いに競合しています.ドキュメントは同じフィールドにできるだけ多くの単語(訳注:検索対象単語)があるべきで、ドキュメントのスコアは最適な一致を持つフィールドから来るべきです.
多数フィールド(Most fields)
相関を最適化するための一般的な技術は、同じデータを複数のフィールドにインデックスし、各フィールドに独自の分析チェーン(Analysis Chain)を持つことです.
メインフィールドには、単語の語幹部分、同義語、変音記号を除去した単語が含まれます.ドキュメントをできるだけ多く一致させるために使用されます.
同じテキストを他のフィールドにインデックスして、より正確な一致を提供することができます.1つのフィールドには、抽出されていない語幹の単語が含まれている可能性があり、もう1つのフィールドには変音記号が含まれている単語が含まれており、3番目のフィールドにはshingleを使用して単語の隣接度(Word Proximity)に関する情報を提供します.
これらの追加のフィールドは、一致する各ドキュメントの相関スコアを増加させるためにsignalの役割を果たします.多くのフィールドが一致するほど、ドキュメントの相関が高くなります.
クロスフィールド(Cross fields)
エンティティによっては、識別情報が複数のフィールドに表示され、各フィールドには情報の一部のみが含まれます.
Person:first_nameおよびlast_nameBook:title,authorおよびdescriptionAddress:street,city,countryおよびpostcodeこの場合、任意のフィールドにできるだけ多くの単語を見つけたいと考えています.これらのフィールドが1つのフィールドのように、複数のフィールドでクエリーする必要があります.
以上は、マルチワード、マルチフィールドクエリーですが、それぞれ異なるポリシーが必要です.この章の残りの部分で各戦略を説明します.