Elastic Certified Engineer Exam対策 – Search Data 2 <クエリ重点解説>

Training banner: Elastic Certified Engineer Exam overview with a presenter icon and group, with 'TRAINING' on the right. トレーニング
  1. このブログの目的
  2. クエリの種類
    1. 『10種類』のQuery DSL
    2. クエリ一覧
  3. 試験対策として抑えておくべきクエリ
    1. Compound queries – Boolean
    2. Full text queries – Match
      1. サンプル① 基本的なMatchクエリ
      2. サンプル② operatorを指定したMatchクエリ
      3. 主なParameters
    3. Full text queries – Match phrase
      1. サンプル① 基本的なMatch phraseクエリ
      2. サンプル② slopを指定したMatch phraseクエリ
    4. Full text queries – Multi-match
      1. サンプル① 基本的なMulti-matchクエリ
      2. サンプル② typeを指定したMulti-matchクエリ
    5. Match all
      1. サンプル① 基本的なMatch allクエリ
    6. Term-level queries – Exists
      1. サンプル① 基本的なExistsクエリ
      2. サンプル② Boolクエリと組み合わせたExistsクエリ
    7. Term-level queries – Fuzzy
      1. サンプル① 基本的なFuzzyクエリ
      2. サンプル② fuzzinessを指定したFuzzyクエリ
    8. Term-level queries – Prefix
      1. サンプル① 基本的なPrefixクエリ
      2. サンプル② case_insensitive : true を指定したPrefixクエリ
      3. サンプル③ case_insensitive : false を指定したPrefixクエリ
    9. Term-level queries – Range
      1. サンプル① 基本的なRangeクエリ
      2. サンプル② 上限・下限を指定したRangeクエリ
    10. Term-level queries – Term
      1. サンプル① 基本的なTermクエリ
      2. サンプル② case_insensitiveとboostを指定したTermクエリ
    11. Term-level queries – Terms
  4. 実践問題
    1. Practice Question 1
      1. 回答
      2. 解説
    2. Practice Question 2
      1. 回答
      2. 解説
  5. Elastic社が提供する無料Hands-on Trainingで理解を深めよう
  6. 試験で問われるポイント

このブログの目的

本ブログシリーズの目的は、Elastic Certified Engineer Examの合格に必要な知識と技術を体系的に習得することです。Elastic Certified Engineer Examでは、Elasticsearchの検索機能を理解し、要件に応じて適切なQuery DSLを実装できる能力が求められます。本記事では、試験で特に重要となるQuery DSLについて、特徴や使い分け、代表的なオプションを解説するとともに、実際にDev Toolsで実行可能なサンプルクエリを通して実装方法を学びます。

また、本記事は、Elastic社が公開している試験ガイドの以下の試験範囲に関連する内容を扱います。

Searching Data – Write and execute a search query for terms and/or phrases in one or more fields of an index

また、検索結果の絞り込みや全文検索、完全一致検索など、それぞれのQuery DSLの役割を理解するだけでなく、どのような要件でどのQueryを選択すべきかを理解することも重要です。記事の後半では実践問題も用意していますので、学習した内容を実際に手を動かしながら確認し、試験本番で迷わずクエリを実装できるレベルを目指しましょう。

試験情報は以下サイトで確認可能です。

クエリの種類

Elasticsearchでは、検索要件に応じてさまざまな種類のQuery DSLが提供されています。それぞれ用途や特徴が異なり、目的に応じて使い分けることが重要です。

まずは、Query DSLがどのような種類に分類されているのかを確認します。そのうえで、Elastic Certified Engineer Examで特に重要となるQuery DSLをピックアップし、それぞれの特徴や実装方法を詳しく見ていきましょう。

『10種類』のQuery DSL

本章では、Query DSLに用意されている主要なQueryをカテゴリごとに紹介します。Elastic Certified Engineer Examでは、すべてのQueryが出題対象となるわけではありませんが、それぞれの役割や用途を理解しておくことで、検索要件に応じて適切なQueryを選択できるようになります。特に、Boolean Query、Full text queries、Term-level queriesは試験・実務ともに重要なカテゴリであり、重点的に学習することをお勧めします。

No.カテゴリ概要説明
1Compound queries複数Queryの論理結合Compound queriesは、複数のQueryを組み合わせて検索条件を構成するためのQueryです。代表的なBoolean Queryでは、must、should、must_not、filterを組み合わせることで柔軟な検索条件を実現できます。mustは必須条件、shouldは任意条件(条件によって必須化も可能)、must_notは除外条件、filterはスコアを計算しない絞り込み条件として利用されます。検索条件を論理的に組み立てる際の中心となるQueryです。
2Full text queries全文検索Full text queriesは、Analyzerによって解析されたFieldを対象とした全文検索を行うためのQueryです。Fieldに格納されたTokenを対象として検索を行うため、単純な完全一致ではなく、自然言語に近い検索を実現できます。Match QueryやMulti-match Query、Match phrase Queryなどが代表的です。
3Geo queries地理情報検索Geo queriesは、位置情報(geo_pointやgeo_shape)を対象として検索を行うためのQueryです。指定した地点から一定距離以内の検索や、矩形・多角形で囲まれた範囲内の検索など、地理情報を利用した検索を実現できます。
4Shape queries図形データ検索Shape queriesは、shape型やgeo_shape型のFieldに格納された図形データを対象として検索を行うQueryです。点・線・多角形などの図形に対して、交差(intersects)、包含(within・contains)、非交差(disjoint)などの空間関係を指定した検索を実現できます。
5Joining queries階層構造検索Joining queriesは、Nested型や親子(Parent-Child)関係を持つDocumentを対象として検索を行うためのQueryです。通常のDocument検索では表現できない階層構造を検索できることが特徴です。
6Match all全件取得Match all Queryは、Index内のすべてのDocumentを取得する最もシンプルなQueryです。検索条件を指定せず全件取得したい場合や、Aggregation、Sort、Paginationなど他の機能と組み合わせる際のベースQueryとして利用されます。
7Span queriesTerm位置検索Span queriesは、Termの位置関係(Position)を考慮した高度な全文検索を行うためのQueryです。Term同士の距離や出現順序、包含関係などを細かく指定できるため、通常のMatch Queryでは実現できない検索が可能になります。
8Vector queriesベクトル類似検索Vector queriesは、ベクトル化されたデータを対象として類似検索や意味検索を行うためのQueryです。近年の生成AIやRAG(Retrieval-Augmented Generation)などで利用されており、意味的に近いDocumentを検索できます。
9Specialized queries特殊用途検索Specialized queriesは、特定の用途に特化したQueryをまとめたカテゴリです。More Like This Queryによる類似Document検索、Script Queryによるスクリプトを利用した条件判定、Percolate Queryによる登録済みQueryとの照合など、用途に応じたさまざまなQueryが提供されています。
10Term-level queries完全一致・範囲検索Term-level queriesは、Analyzerによる解析を行わず、Fieldに格納された値をそのまま対象として検索を行うQueryです。主にkeyword型や数値型、日付型、boolean型などに対する完全一致検索や範囲検索で利用されます。Term Query、Terms Query、Range Query、Exists Queryなどが代表的です。

クエリ一覧

上記カテゴリに属する各クエリを以下に一覧で記載します。出題される可能性が高いと考えるものに★マークを付与しています。

★マークは、出題頻度や出題可能性を保証するものではありません。筆者自身の受験経験(2回)や他の受験者から得た情報をもとに、「比較的出題される可能性が高い」と考えられるQueryをピックアップしています。学習の優先順位を決める際の参考としてご覧ください。

Query DSL
├─ [1] Compound queries            :複数Queryの論理結合
│  ├─ Boolean                      :★ AND/OR/NOT検索
│  ├─ Boosting                     :検索結果の優先度調整
│  ├─ Constant score               :Filterを一定スコアで評価
│  ├─ Disjunction max              :最も高いスコアを採用
│  └─ Function score               :スコアを独自計算
├─ [2] Full text queries           :全文検索
│  ├─ Intervals                    :単語位置を考慮した検索
│  ├─ Match                        :★ 全文一致検索
│  ├─ Match boolean prefix         :入力補完検索
│  ├─ Match phrase                 :★ フレーズ検索
│  ├─ Match phrase prefix          :フレーズ補完検索
│  ├─ Combined fields              :複数Fieldを1つとして検索
│  ├─ Multi-match                  :★ 複数Field検索
│  ├─ Query string                 :Lucene構文検索
│  ├─ Simple query string          :簡易Lucene構文検索
│  └─ KQL                          :Kibana検索構文
├─ [3] Geo queries                 :位置情報検索
│  ├─ Geo-bounding box             :矩形範囲検索
│  ├─ Geo-distance                 :距離検索
│  ├─ Geo-grid                     :Geo Grid検索
│  ├─ Geo-polygon                  :多角形範囲検索
│  └─ Geoshape                     :地理形状検索
├─ [4] Shape queries               :Shape型検索
│  └─ Shape                        :図形データ検索
├─ [5] Joining queries             :親子・Nested検索
│  ├─ Nested                       :Nested型検索
│  ├─ Has child                    :子→親検索
│  ├─ Has parent                   :親→子検索
│  └─ Parent ID                    :親ID検索
├─ [6] Match all                   :★ 全Document取得
├─ [7] Span queries                :位置関係検索
│  ├─ Span containing              :包含検索
│  ├─ Span field masking           :Field跨ぎ検索
│  ├─ Span first                   :先頭付近検索
│  ├─ Span multi-term              :Prefix等との組合せ
│  ├─ Span near                    :近接検索
│  ├─ Span not                     :除外付き近接検索
│  ├─ Span or                      :Span OR検索
│  ├─ Span term                    :Span単語検索
│  └─ Span within                  :内包検索
├─ [8] Vector queries              :ベクトル検索
│  ├─ Knn                          :近傍ベクトル検索
│  ├─ Sparse vector                :ELSER検索
│  ├─ Semantic                     :意味検索
│  ├─ Text expansion               :埋め込み検索
│  └─ Weighted tokens              :重み付きToken検索
├─ [9] Specialized queries         :特殊用途検索
│  ├─ Distance feature             :距離スコア検索
│  ├─ More_like_this               :類似Document検索
│  ├─ Percolate                    :登録Query照合
│  ├─ Rank feature                 :ランキング最適化
│  ├─ Script                       :スクリプト検索
│  ├─ Script score                 :スコア計算
│  ├─ Wrapper                      :Base64 Query実行
│  ├─ Pinned query                 :指定Documentを優先表示
│  └─ Rule                         :検索ルール適用
├─ [10] Term-level queries         :完全一致検索
│  ├─ Exists                       :★ Field存在確認
│  ├─ Fuzzy                        :★ あいまい検索
│  ├─ IDs                          :ID検索
│  ├─ Prefix                       :★ 前方一致検索
│  ├─ Range                        :★ 範囲検索
│  ├─ Regexp                       :正規表現検索
│  ├─ Term                         :★ 完全一致検索
│  ├─ Terms                        :★ 複数値一致検索
│  ├─ Terms set                    :一致数条件検索
│  └─ Wildcard                     :ワイルドカード検索
├─ minimum_should_match parameter  :should一致数制御
├─ rewrite parameter               :Multi-term Query最適化
└─ Regular expression syntax       :Regexp構文

★マークをピックアップすると、以下となります。

[1] Compound queries
├─ Boolean

[2] Full text queries
├─ Match
├─ Match phrase
└─ Multi-match

[6] Match all

[10] Term-level queries
├─ Exists
├─ Fuzzy
├─ Prefix
├─ Range
├─ Term
└─ Terms

次の章では、これらのクエリについて解説していきます。

試験対策として抑えておくべきクエリ

Compound queries – Boolean

こちらについては別記事『Elastic Certified Engineer Exam対策 – Search Data 1 <検索・集計・分析>』第4章 『Boolクエリ』 を参照してください。

Full text queries – Match

matchクエリは、Elasticsearchで最も基本的な全文検索クエリです。検索対象フィールドと検索語の両方にAnalyzerが適用され、単語単位で関連するDocumentを検索します。そのため、単純な文字列一致ではなく、自然言語やログメッセージのようなtext型フィールドに対して柔軟な検索を実現できます。Elastic Certified Engineer Examでも重要なクエリであり、termクエリとの違いを理解しておくことが重要です。

サンプル① 基本的なMatchクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "match": {
      "message": "elasticsearch"
    }
  }
}

サンプル② operatorを指定したMatchクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "match": {
      "message": {
        "query": "elasticsearch tar.gz 404",
        "operator": "and"
      }
    }
  }
}
  • queryで検索語を指定 queryには検索対象となるフレーズを指定します。サンプル②では、elasticsearchtar.gz404の3つの単語を検索語として指定しています。
  • operatorで検索条件を制御 operator: "and"を指定することで、すべての検索語を含むDocumentのみが検索対象となります。デフォルトのorでは、いずれか1つの検索語を含むDocumentがヒットします。
  • Analyzerが適用される matchクエリでは、Index作成時と検索時の両方でAnalyzerが適用されます。そのため、検索語は単語単位に解析されたうえで検索が実行されます。
  • より厳密な全文検索を実現 operator: "and"を利用することで、複数の検索語すべてに一致するDocumentのみを取得でき、検索結果を効率的に絞り込むことができます。

主なParameters

matchクエリでは、operatorオプションが代表的です。デフォルトのorでは、複数の検索語のいずれかを含むDocumentがヒットします。一方、andを指定すると、すべての検索語を含むDocumentだけが検索対象となります。サンプル②では、elasticsearchtar.gz404の3つすべてを含むDocumentのみがヒットするため、検索結果をより厳密に絞り込むことができます。

Elastic Docs > Reference > Elasticsearch > Query languages > Query DSL > Full text queries > Match

Full text queries – Match phrase

match_phraseクエリは、複数の単語が指定した順序で連続して出現するDocumentを検索する全文検索クエリです。matchクエリと同様にAnalyzerが適用されますが、単語の並び順や位置関係も考慮して検索が行われます。そのため、「単語が含まれているだけ」ではなく、「フレーズとして一致する」Documentを検索したい場合に利用します。Elastic Certified Engineer Examでは、matchクエリとの違いを理解しておくことが重要です。

サンプル① 基本的なMatch phraseクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "match_phrase": {
      "message": "GET /apm HTTP"
    }
  }
}

サンプル② slopを指定したMatch phraseクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "match_phrase": {
      "message": {
        "query": "GET HTTP 200",
        "slop": 2,
        "boost": 2.0
      }
    }
  }
}
  • queryで検索フレーズを指定 GET HTTP 200を検索語として指定し、単語の並び順を考慮したフレーズ検索を実行します。
  • slopで単語間のずれを許容 slop: 2を指定することで、検索語の間に最大2語まで存在する場合でも一致と判定されます。厳密なフレーズ検索より柔軟な検索が可能です。
  • boostでスコアを調整 boost: 2.0を指定することで、このmatch_phraseクエリの関連度を2倍に評価します。他のQueryと組み合わせた場合に、検索結果の順位へ影響を与えることができます。
  • フレーズ検索に適している matchクエリとは異なり、単語の順序や位置関係を考慮して検索するため、文章やログメッセージの特定フレーズを検索する際に適しています。

主なParameters

Parameter説明
query検索対象となるフレーズを指定します。文字列だけでなく、数値・真偽値・日付も指定できます。
analyzer検索時に使用するAnalyzerを指定します。省略した場合は、FieldまたはIndexのデフォルトAnalyzerが使用されます。
boostクエリの関連度(_score)に重み付けを行います。デフォルトは1.0で、1.0より大きい値を指定するとスコアが高く評価されます。
slop検索語間に許容する位置のずれ(Position)を指定します。デフォルトは0で、完全に連続したフレーズのみが一致します。

Elastic Docs > Reference > Elasticsearch > Query languages > Query DSL > Full text queries > Match phrase

Full text queries – Multi-match

multi_matchクエリは、複数のFieldを対象として全文検索を実行するためのクエリです。タイトル・本文・概要など複数のtext型Fieldを一度に検索したい場合に利用されます。検索対象FieldごとにAnalyzerが適用され、typeオプションで指定した検索方式に応じて関連度(_score)が計算されます。

代表的なtypeには、最も一致度の高いFieldを評価するbest_fields、複数Fieldのスコアを合算するmost_fields、複数Fieldを1つのFieldとして扱うcross_fieldsなどがあります。Elastic Certified Engineer Examでは、matchクエリとの違いや、typeオプションの役割を理解しておくことが重要です。

サンプル① 基本的なMulti-matchクエリ

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "multi_match": {
      "query": "Women's",
      "fields": [
        "category",
        "manufacturer"
      ]
    }
  }
}

サンプル② typeを指定したMulti-matchクエリ

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "multi_match": {
      "query": "Women's",
      "fields": [
        "category^2",
        "manufacturer"
      ],
      "type": "best_fields"
    }
  }
}

解説

  • 複数Fieldを対象に全文検索 categorymanufacturerの2つのFieldを対象に、Women'sを全文検索します。
  • FieldごとにBoost値を指定 category^2と指定することで、categoryで一致した場合のスコアを2倍に評価します。一方、manufacturerはデフォルトの重み(1.0)で検索されます。
  • typeでスコアリング方法を指定 type: "best_fields"を指定すると、最も一致度の高いFieldを主に評価して_scoreを算出します。multi_matchクエリのデフォルト値でもあり、最も一般的に利用される検索方式です。
  • 重要なFieldを優先した検索を実現 best_fieldsによるField評価と、FieldごとのBoostを組み合わせることで、重要なFieldで一致したDocumentを検索結果の上位に表示しやすくなります。

主なParameters

Option説明
fields検索対象となるFieldを指定します。field^2のようにBoost値を指定し、特定Fieldのスコアを高く評価することも可能です。
typeFieldごとのスコアの計算方法を指定します。代表的な値はbest_fields(最も高いスコアを採用)、most_fields(複数Fieldのスコアを合算)、cross_fields(複数Fieldを1つのFieldとして扱う)です。
tie_breakertype: best_fieldsで利用されます。最も高いスコアを持つFieldに加え、他の一致Fieldのスコアも一定割合だけ加算できます。複数Fieldで一致したDocumentを適切に評価したい場合に利用します。

Typeに指定できる値

type説明
best_fields最も一致度の高いFieldを主に評価します。最も一般的な指定で、デフォルト値です。
most_fields複数のFieldのスコアを合算して評価します。同じ内容が複数Fieldに格納されている場合に適しています。
cross_fields複数のFieldを1つのFieldとして扱って検索します。氏名をfirst_namelast_nameに分けて保持しているような場合に適しています。
phrase各Fieldに対してmatch_phraseクエリを実行します。単語の並び順を考慮したフレーズ検索を行います。
phrase_prefix各Fieldに対してmatch_phrase_prefixクエリを実行します。フレーズ検索に加え、最後の単語を前方一致で検索します。検索候補(サジェスト)の実装などに利用されます。
bool_prefix各Fieldに対してmatch_bool_prefixクエリを実行します。最後の単語を前方一致、それ以前の単語を通常のtermクエリとして検索します。インクリメンタルサーチ(入力補完)に適しています。

Typeに指定できる値
typeで指定できるすべての値を暗記し、マニュアルを見ずに実装できるレベルまで習得する必要はありません。まずは、typeに複数の指定値があり、それぞれに異なる検索方式が用意されていることを理解しておけば十分です。

Elastic Certified Engineer Examでは、要件に応じてElastic公式ドキュメントを参照し、適切なtypeを選択してクエリを実装できることが求められます。そのため、各typeの特徴や用途を把握しておくことを意識して学習しましょう。

Elastic Docs > Reference > Elasticsearch > Query languages > Query DSL > Full text queries > Multi-match

Match all

match_allクエリは、Index内のすべてのDocumentを取得する最もシンプルなクエリです。検索条件を指定せずに全件取得したい場合や、Aggregation、Sort、Paginationなど他の機能と組み合わせる際のベースクエリとして利用されます。Elastic Certified Engineer Examでは単独で出題されることは多くありませんが、集計や並び替えなどのサンプルクエリで頻繁に登場するため、基本的な使い方を理解しておくことが重要です。

サンプル① 基本的なMatch allクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "match_all": {}
  }
}
  • Index内の全Documentを取得 検索条件を指定せず、Index内のすべてのDocumentを検索対象とします。
  • ベースクエリとして利用される AggregationやSort、Paginationなどを組み合わせる際の基礎となるクエリとしてよく利用されます。
  • スコアはすべて同一 すべてのDocumentが検索条件を満たすため、基本的には同一の_scoreで返されます。

主なParameters

match_allクエリには、試験で押さえておくべき代表的なオプションはありません。主にAggregation、Sort、fromsizeによるPaginationなどと組み合わせて利用されるベースクエリとして理解しておけば十分です。

Elastic Docs > Reference > Elasticsearch > Query languages > Query DSL > Match all query

Term-level queries – Exists

existsクエリは、指定したFieldが存在するDocumentを検索するためのTerm-level Queryです。Analyzerによる解析は行われず、Fieldに値が存在するかどうかのみを判定します。特定のFieldが設定されているDocumentだけを取得したい場合や、欠損データを除外したい場合によく利用されます。

サンプル① 基本的なExistsクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "exists": {
      "field": "geo.dest"
    }
  }
}

サンプル② Boolクエリと組み合わせたExistsクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "geo.dest"
          }
        }
      ],
      "must_not": [
        {
          "exists": {
            "field": "geo.src"
          }
        }
      ]
    }
  }
}
  • Fieldの存在を確認 geo.destが存在するDocumentのみを検索対象とします。
  • must_notとの組み合わせ geo.srcが存在するDocumentを除外することで、geo.destは存在するがgeo.srcは存在しないDocumentだけを取得できます。
  • Analyzerは利用されない existsはTerm-level Queryのため、Fieldの有無のみを判定します。
  • 欠損データの検索に便利 必須Fieldのチェックやデータ品質の確認など、実務でもよく利用されます。

主なParameters

Option説明
field存在確認を行うField名を指定します。existsクエリで必須となる唯一のパラメータです。

Elastic Docs > Reference > Elasticsearch > Query languages > Query DSL > Exists query

Term-level queries – Fuzzy

fuzzyクエリは、検索語と完全に一致しなくても、編集距離(Levenshtein Distance)をもとに類似した値を検索できるTerm-level Queryです。入力ミスやスペルミスを考慮した検索を実現できるため、ユーザー入力を対象とした検索で利用されます。Analyzerによる解析は行われず、keyword型などに格納された値を対象として類似度を評価します。Elastic Certified Engineer Examでは、termクエリとの違いや、fuzzinessパラメータの役割を理解しておくことが重要です。

サンプル① 基本的なFuzzyクエリ

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "fuzzy": {
      "manufacturer.keyword": {
        "value": "Chanpion Arts"
      }
    }
  }
}

サンプル② fuzzinessを指定したFuzzyクエリ

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "fuzzy": {
      "manufacturer.keyword": {
        "value": "Chanpion Arts",
        "fuzziness": 2
      }
    }
  }
}
  • 類似した値を検索 完全一致ではなく、編集距離をもとに類似した値を検索します。
  • manufacturer.keywordを対象に検索 keyword型Fieldに格納された値を対象として、類似度を評価します。
  • fuzzinessで許容範囲を指定 サンプル②ではfuzziness: 2を指定しているため、最大2文字までの追加・削除・置換を許容した検索を行います。
  • スペルミスを考慮した検索に利用 ユーザー入力の誤字脱字を考慮した検索や、候補検索などで利用されます。

主なParameters

Option説明
value検索対象となる値を指定します。
fuzziness許容する編集距離を指定します。012、またはAUTOを指定できます。AUTOでは検索語の長さに応じて編集距離が自動的に決定されます。
prefix_length先頭から完全一致を要求する文字数を指定します。先頭部分を固定することで、検索精度や検索性能の向上が期待できます。

Elastic Docs > Reference > Elasticsearch > Query languages > Query DSL > Fuzzy query

Term-level queries – Prefix

prefixクエリは、指定した文字列で始まる値を検索するTerm-level Queryです。Analyzerによる解析は行われず、Fieldに格納された値をそのまま対象として前方一致検索を実行します。そのため、keyword型のFieldや識別子、コード値などに対する検索で利用されます。Elastic Certified Engineer Examでは、wildcardクエリとの違いや、valueパラメータの役割を理解しておくことが重要です。

サンプル① 基本的なPrefixクエリ

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "prefix": {
      "manufacturer.keyword": {
        "value": "Pri"
      }
    }
  }
}

サンプル② case_insensitive : true を指定したPrefixクエリ

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "prefix": {
      "manufacturer.keyword": {
        "value": "pri",
        "case_insensitive": true
      }
    }
  }
}

サンプル③ case_insensitive : false を指定したPrefixクエリ

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "prefix": {
      "manufacturer.keyword": {
        "value": "pri",
        "case_insensitive": false
      }
    }
  }
}

解説

  • 前方一致検索を実行 指定した文字列で始まる値を持つDocumentを検索します。
  • manufacturer.keywordを対象に検索 keyword型Fieldに格納された値を対象として、前方一致検索を実行します。
  • case_insensitiveで大文字・小文字を無視 サンプル②ではcase_insensitive: trueを指定しているため、TimTIMなど、大文字・小文字の違いを無視して検索できます。 サンプル③では、case_insensitive: false を指定しているため、”pri”の指定ではhitしていません。
  • wildcardクエリとの違い prefixクエリは先頭一致のみを対象とするため、wildcardクエリよりシンプルで効率的に検索できる場合があります。

主なParameters

Option説明
value前方一致検索を行う文字列を指定します。
case_insensitivetrueを指定すると、大文字・小文字を区別せずに検索します。デフォルトはfalseです。

Elastic Docs > Reference > Elasticsearch > Query languages > Query DSL > Prefix query

Term-level queries – Range

rangeクエリは、数値型・日付型・IPアドレス型などのFieldに対して、指定した範囲に含まれる値を検索するTerm-level Queryです。Analyzerによる解析は行われず、Fieldに格納された値をそのまま比較して検索します。価格や日時、レスポンスサイズなど、大小比較が必要な検索で広く利用されます。Elastic Certified Engineer Examでは、gtgteltlteの違いや、範囲指定の方法を理解しておくことが重要です。

サンプル① 基本的なRangeクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "range": {
      "bytes": {
        "gte": 10000
      }
    }
  }
}

サンプル② 上限・下限を指定したRangeクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "range": {
      "@timestamp": {
        "gte": "now-30d",
        "lte": "now"
      }
    }
  }
}
  • 日付範囲検索を実行 @timestampを対象に、指定した期間に含まれるDocumentを検索します。
  • nowを基準とした相対日時を指定 nowは検索実行時の現在時刻を表します。now-30dは30日前の日時を意味し、相対日時による検索が可能です。
  • 上限・下限を指定 gtelteを組み合わせることで、「30日前から現在まで」の期間に作成されたDocumentのみを取得します。
  • 時系列データの検索でよく利用される ログやメトリクスなどの時系列データでは、「過去30日間」「過去24時間」といった期間指定で検索するケースが多く、rangeクエリの代表的な利用例です。

主なParameters

Option説明
gt指定した値より大きい値を検索します(Greater Than)。
gte指定した値以上の値を検索します(Greater Than or Equal)。
lt指定した値より小さい値を検索します(Less Than)。
lte指定した値以下の値を検索します(Less Than or Equal)。
format日付型Fieldで利用する日付フォーマットを指定します。Mappingとは異なる形式で検索する場合に利用します。

Elastic Docs > Reference > Elasticsearch > Query languages > Query DSL > Range query

Term-level queries – Term

termクエリは、指定した値と完全に一致するDocumentを検索するTerm-level Queryです。Analyzerによる解析は行われず、Fieldに格納された値をそのまま比較して検索します。そのため、keyword型や数値型、日付型、boolean型などのFieldに対する完全一致検索で利用されます。Elastic Certified Engineer Examでは、全文検索を行うmatchクエリとの違いを理解しておくことが重要です。

サンプル① 基本的なTermクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "term": {
      "extension.keyword": "deb"
    }
  }
}

サンプル② case_insensitiveとboostを指定したTermクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "term": {
      "extension.keyword": {
        "value": "DEB",
        "case_insensitive": true,
        "boost": 2.0
      }
    }
  }
}
  • 完全一致検索を実行 extension.keywordの値が ”DEB” と一致するDocumentを検索します。
  • case_insensitiveで大文字・小文字を無視 サンプル②ではcase_insensitive: trueを指定しているため、”deb” や ”DEB” など、大文字・小文字の違いを無視して検索できます。
  • boostでスコアを調整 boost: 2.0を指定することで、このtermクエリのスコアを2倍に評価します。他のクエリと組み合わせた際に、検索結果の順位へ影響を与えることができます。
  • matchクエリとの違い termクエリはAnalyzerを利用せず完全一致検索を行うため、全文検索を目的としたmatchクエリとは用途が異なります。

主なParameters

Option説明
value完全一致検索を行う値を指定します。
case_insensitivetrueを指定すると、大文字・小文字を区別せずに検索します。ASCII文字を対象とし、デフォルトはfalseです。
boostクエリのスコアに重み付けを行います。値が大きいほど、このクエリに一致したDocumentの関連度が高く評価されます。

Elastic Docs > Reference > Elasticsearch > Query languages > Query DSL > Term query

Term-level queries – Terms

termsクエリは、複数の値のいずれかに完全一致するDocumentを検索するTerm-level Queryです。termクエリが1つの値との完全一致検索を行うのに対し、termsクエリは複数の候補をまとめて指定できます。Analyzerによる解析は行われず、keyword型や数値型、日付型、boolean型などのFieldを対象として検索を実行します。Elastic Certified Engineer Examでは、termクエリとの違いや、複数条件を効率的に指定する方法を理解しておくことが重要です。

サンプル boostを指定したTermsクエリ

GET kibana_sample_data_logs/_search
{
  "query": {
    "terms": {
      "extension.keyword": [
        "css",
        "gz",
        "deb"
     ],
      "boost": 2.0
    }
  }
}

解説

  • 複数値による完全一致検索を実行 extension.keyword が css、gz、deb のいずれかに一致するDocumentを検索します。
  • OR条件として評価される 指定した値のいずれか1つに一致すれば検索対象となるため、複数のtermクエリをOR条件で指定する場合と同様の結果が得られます。
  • boostでスコアを調整 boost: 2.0を指定しているため、このtermsクエリに一致したDocumentのスコアを高く評価できます。
  • termクエリとの違い termクエリは1つの値との完全一致検索ですが、termsクエリは複数の値をまとめて指定できるため、より効率的に検索条件を記述できます。

主なParameters

Option説明
boostクエリのスコアに重み付けを行います。値が大きいほど、このクエリに一致したDocumentの関連度が高く評価されます。
terms lookup他のDocumentに格納されている値を取得し、その値を検索条件として利用します。大量の検索値を動的に指定する場合に利用されます。

Elastic Docs > Reference > Elasticsearch > Query languages > Query DSL > Terms query

実践問題

Practice Question 1

You are working with the kibana_sample_data_ecommerce index.

Write and execute a search query that satisfies all of the following requirements:

  1. Search documents where either category or manufacturer matches the text “Men’s”.
  2. Give higher relevance to matches in the category field than matches in the manufacturer field.
  3. Return only documents where currency is EUR.
  4. Exclude documents where customer_gender is MALE.
  5. Return only documents where taxful_total_price is greater than or equal to 50.
  6. Sort the results by taxful_total_price in descending order.
  7. Return the first 10 results.

Use Kibana Dev Tools format and write the complete query against the kibana_sample_data_ecommerce index.

回答

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "Men's",
            "fields": [
              "category^2",
              "manufacturer"
            ]
          }
        }
      ],
      "filter": [
        {
          "term": {
            "currency": "EUR"
          }
        },
        {
          "range": {
            "taxful_total_price": {
              "gte": 50
            }
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "customer_gender": "MALE"
          }
        }
      ]
    }
  },
  "sort": [
    {
      "taxful_total_price": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 10
}

解説

この問題では、検索条件の指定に加え、スコアリング、絞り込み、並び替え、Paginationを組み合わせて要件を満たすクエリを実装しています。

  • multi_matchで複数Fieldを全文検索 categoryとmanufacturerを検索対象としています。category^2を指定することで、categoryに一致したDocumentをより高く評価します。
  • filterでスコアに影響しない条件を指定 currencyがEURであること、およびtaxful_total_priceが50以上であることは絞り込み条件のため、filterを使用しています。
  • must_notで検索結果から除外 customer_genderがMALEのDocumentを検索結果から除外しています。
  • sortで検索結果を並び替え taxful_total_priceを降順(desc)でソートし、高価格の商品から表示しています。
  • fromとsizeでPaginationを実装 from: 0とsize: 10を指定し、検索結果の先頭10件を取得しています。

Practice Question 2

You are working with the kibana_sample_data_logs index.

Write and execute a search query that satisfies all of the following requirements:

  1. Do not return individual documents.
  2. Use a range query to search only documents where bytes is greater than or equal to 5000.
  3. Create a date histogram bucket aggregation named access_per_day using the @timestamp field.
  4. Use a daily calendar interval.
  5. For each day, calculate the average value of bytes and name the metric aggregation avg_bytes.
  6. For each day, calculate the maximum value of bytes and name the metric aggregation max_bytes.
  7. Add a pipeline aggregation named moving_avg_bytes that calculates the moving average of avg_bytes.
  8. Use a moving window of 3 buckets.
  9. Sort the date buckets in ascending order.

Use Kibana Dev Tools format and write the complete query against the kibana_sample_data_logs index.

回答

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "query": {
    "range": {
      "bytes": {
        "gte": 5000
      }
    }
  },
  "aggs": {
    "access_per_day": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "1d",
        "order": {
          "_key": "asc"
        }
      },
      "aggs": {
        "avg_bytes": {
          "avg": {
            "field": "bytes"
          }
        },
        "max_bytes": {
          "max": {
            "field": "bytes"
          }
        },
        "moving_avg_bytes": {
          "moving_fn": {
            "buckets_path": "avg_bytes",
            "window": 3,
            "script": "MovingFunctions.unweightedAvg(values)"
          }
        }
      }
    }
  }
}

解説

この問題では、rangeクエリでbytesが5,000以上のDocumentだけを検索対象とし、その結果に対して3種類のAggregationを実行しています。

各Aggregationの役割は次のとおりです。

  • Bucket Aggregation
    • date_histogram
    • @timestampを1日単位でグループ化します。
  • Metric Aggregation
    • avg_bytes:1日ごとの平均bytes
    • max_bytes:1日ごとの最大bytes
  • Pipeline Aggregation
    • moving_avg_bytes
    • avg_bytesを入力として、3日間の移動平均を算出します。

また、size: 0を指定することで、Documentは取得せず、Aggregation結果のみを返しています。

本問題で利用している主な機能は以下のとおりです。

  • rangeクエリ
  • date_histogram(Bucket Aggregation)
  • avg、max(Metric Aggregation)
  • moving_fn(Pipeline Aggregation)

Elastic Certified Engineer Examでは、検索条件を指定したうえでAggregationを組み合わせる問題も出題されます。それぞれを個別に覚えるだけでなく、「Query → Bucket Aggregation → Metric Aggregation → Pipeline Aggregation」という処理の流れを理解しておくことが重要です。

Elastic社が提供する無料Hands-on Trainingで理解を深めよう

本記事では、Elastic Certified Engineer Examで頻出となるQuery DSLについて解説しました。しかし、試験ではクエリの意味を理解しているだけでは十分ではなく、要件に応じて適切なクエリを実装できることが求められます。

そのため、本記事で学習した内容は、実際にDev Toolsでクエリを実行しながら理解を深めることをお勧めします。検索条件やオプションを変更し、その違いが検索結果にどのような影響を与えるのかを確認することで、知識を実践的なスキルとして身につけることができます。

さらに、Elastic社が提供している無料のHands-on TrainingやOn-Demand Trainingでは、実際にElasticsearchを操作しながら学習できる環境が用意されています。Query DSLだけでなく、Aggregation、Ingest Pipeline、ILM、Data Streamなど、試験範囲全体を体系的に学習できるため、試験対策としても非常に有効です。

本記事で紹介したクエリを繰り返し実装しながら、Hands-on Trainingも活用することで、試験本番でも要件に応じて迷わずクエリを実装できるレベルを目指しましょう。

Elastic Cloud アカウント作成

Elastic Training

Elastic Learning Portal

試験で問われるポイント

  • Full text queriesとTerm-level queriesを要件に応じて使い分けることができること
  • match、match_phrase、multi_match、term、terms、range、exists、fuzzy、prefixなどの主要なQuery DSLを実装できること
  • 各Queryの代表的なオプション(operator、slop、type、fuzziness、case_insensitive、gt/gte/lt/lteなど)を適切に利用できること
  • Bool Queryを利用して、must、should、filter、must_notを組み合わせた検索条件を実装できること
  • Sort、Pagination(from・size)、Aggregationを組み合わせた検索クエリを実装できること

クエリに関する問題としては、主に次の2つのパターンが考えられます。

・Bucket Aggregation、Metric Aggregation、Pipeline Aggregationの3種類を組み合わせたAggregation問題
・Paging、Sort、および本記事で取り上げた11種類の主要なQuery DSLのいずれかを組み合わせた検索クエリの実装問題

試験は全10問で構成されるため、少なくともこれら2つのパターンについては、要件を満たすクエリを自力で実装できるレベルまで習得しておくことをお勧めします。