フィルタの実行

edit

前のセクションでは、ドキュメントスコア(検索結果内の`_score`フィールド)についての説明をスキップしました。スコアは、そのドキュメントが指定した検索クエリにどの程度一致しているかの相対的な基準となる数値です。スコアが高いほどドキュメントの関連性が高く、スコアが低いほどドキュメントの関連性が低くなります。

ただし、クエリが常にスコアを生成するとは限りません。特にクエリをドキュメントセットの「フィルタリング」にのみ使用した場合は、スコアを生成しません。Elasticsearchはこれらの状況を検知し、無駄なスコアを計算しないようにクエリの実行を自動で最適化します。

前のセクションで紹介した​bool クエリ​は、filter`句もサポートします。これにより、スコアの計算方法を変更せずに、クエリを使用して別の句が一致するドキュメントを限定することができます。一例として、​{ref}/query-dsl-range-query.html[`range クエリ]​を紹介します。これを使用すると、値の範囲でドキュメントをフィルタできます。一般的に、数値または日付のフィルタリングに使用されます。

次の例は、boolクエリを使用して、残高が20000以上30000以下の口座をすべて返します。言い換えると、残高が20000以上で30000以下の口座を検索します。

GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

上記を分析すると、boolクエリは`match_all`クエリ(query部)と`range`クエリ(filter部)を含んでいます。他のクエリをquery部とfilter部に置き換えることができます。上記の事例では、範囲内にあるドキュメントはすべて「同様に」一致する、つまり他に関連性が高いドキュメントがないため、rangeクエリは妥当です。

match_allmatchbool、および`range`クエリのほかに、利用可能なクエリタイプは数多くありますが、ここでは説明しません。これらのクエリの仕組みについて基本的に理解しましたので、この知識を他のクエリタイプの学習と実験に応用することは難しくありません。