Elasticsearchの検索クエリについて


本記事の概要

Elasticsearchのリファレンスを読みながら、検索クエリについてまとめました!
クエリの理解に役立てていただけたら幸いです。

最初にまず、検索クエリを実行したときElasticsearchがどういう風に結果を返すのか
について触れたいと思います。

その後、実際にクエリの例を参考にしながら解説していきます。

Elasticsearchは検索結果をどう返すのか

結論から言うと、検索用クエリのマッチ度が高いドキュメント順に返却します。
ここでいうマッチ度を関連性スコアと呼びます。

デフォルトでは、Elasticsearchは一致する検索結果を関連性スコアで並び替えます。
関連性スコアはドキュメントがクエリとどの程度一致しているかを測定します。

関連性スコアは検索APIの_scoreとして返されます。
_scoreが高いほど、ドキュメントの関連性が高くなります。

関連性スコアの計算方法はクエリの種類ごとに異なります。

Elasticsearchの検索クエリ

Elasticsearch

GET /search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title" :   "Elasticsearch" }},
        { "match": { "content" : "Search" }}
      ],
      "filter": [
        { "term":  { "status" : "published" }},
        { "range": { "publish_date" : { "gte" : "2015-01-01" }}}
      ]
    }
  }
}

queryではドキュメントとどの程度一致するのかという指標を、関連性スコア(_score)として返します。

must句とshould句のスコアは組み合わされており、一致するクエリが多いほど高いスコアを返します。
boolクエリは、以下の複数種類のクエリを組み合わせることができます。

クエリ 説明
must 必ずドキュメントに一致しなければいけない。スコアに貢献する。
filter 一致しないドキュメントは除外される。スコアは無視する。
should 一致する場合、スコアに貢献する。
must_not 必ずドキュメントに含まれてはいけない。スコア無視する。

matchクエリは、指定されたテキスト、数値、日付、またはブール値に一致するドキュメントを返します。
あいまい一致のオプションを含む、全文検索を実行するための標準クエリです。
検索文字のタイプミスがあっても、自動的に補完してくれます。

termクエリは、指定されたフィールドに正確な用語を含むドキュメントを返します。
rangeクエリは、指定された範囲内の用語を含むドキュメントを返します。

他にもリファレンスにたくさん載っているので、気になった方はぜひ参照してみてください。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html