📖

Elasticsearchの基本クエリのざっくりしたまとめ

2022/03/21に公開

久しぶりにElasticsearchに触ったりするときに、クエリを思い出す用のメモです

CRUD操作

ドキュメントの取得

GET test_index/_doc/1

ドキュメントの検索

GET test_index/_search
{
  "query": {
    "match": {
      "message": "hello"
    }
  }
}

ドキュメントの作成・更新

  • PUTを使うとidを指定してインデックスの作成と更新が行える
  • POSTを使うとidがランダムでインデックスが作成される
PUT  test_index/_doc/1
{
  "message": "Hello world",
  "date": "2022-03-21"
}

POST test_index/_doc
{
  "message": "Hello world",
  "date": "2022-03-21"
}

ドキュメント内のフィールドのみの更新

POST test_index/_update/1
{
  "doc": {
    "message": "hogehoge"
  }
}

ドキュメントの削除

DELETE test_index/_doc/1

matchによる検索

基本的にはtext型のフィールドに対して用いる

match_all

  • ドキュメントの確認に用いることが多い
GET test_index/_search
{
  "query": {
    "match_all": {}
  }
}

match

  • 空白文字で区切ると複数ワードでの検索になる
"hello" OR "world"で検索する例
GET test_index/_search
{
  "query": {
    "match": {
      "message": "hello world"
    }
  }
}
"hello" AND "world"で検索する例
GET test_index/_search
{
  "query": {
    "match": {
      "message": "hello world",
      "operator": "and"
    }
  }
}
"red","blue","green"のうち、最低2つ以上のワードを含む条件で検索する例
GET test_index/_search
{
  "query": {
    "match": {
      "message": "red blue green",
      "minimum_should_match": 2
    }
  }
}

match_phrase

  • 複数ワードの指定で、指定された順の条件で検索を行う
"red","blue","green"の順でワードが含まれる条件で検索する例
GET test_index/_search
{
  "query": {
    "match_phrase": {
      "message": "red blue green"
    }
  }
}

termによる検索

指定したワードに完全一致したフィールドを探すときに使う
keyword型を用いる

term

GET test_index/_search
{
  "query": {
    "term": {
      "city": "Los Angeles"
    }
  }
}

terms

  • 検索ワードを複数指定できる
  • どれかに一致すればヒットする
GET test_index/_search
{
  "query": {
    "terms": {
      "city": ["Los Angeles", "New York", "Tokyo"] 
    }
  }
}

range

  • 数値型や日付型のフィールドの範囲検索ができる
GET test_index/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 100,
	"lte": 200
      }
    }
  }
}

Boolクエリ

must,shouldなどのクエリを組み合わせて細かい条件を指定して検索できる

must

  • 必ず含まれているべきクエリ条件
  • 複数クエリが指定されている場合、全ての条件を満たす必要がある
GET test_index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "message": "hello world" } },
	{ "match": { "name": "test" } }
      ]
    }
  }
}

should

  • いずれかのクエリ条件が満たされればドキュメントがヒットする
GET test_index/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "message": "hello world" } },
	{ "match": { "name": "test" } }
      ]
    }
  }
}

must_not

  • マッチするドキュメントを検索条件から除外する
GET test_index/_search
{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "message": "hello" } }
      ]
    }
  }
}

filter

  • 関連度に関係なく検索条件にマッチするかどうかのみが返される
  • 検索範囲を絞りたい場合に使う
GET test_index/_search
{
  "query": {
    "bool": {
      "filter": [
        { "match": { "message": "hello" } }
      ]
    }
  }
}

Sort

デフォルトでは関連度のスコアに基づいてソートが行われる

GET test_index/_search
{
  "query": {
    "match": { "message": "hello world" }
  },
  "sort": [
    { "price": { "order": "desc" } },
    { "date": { "order": "asc" } }
  ]
}

Metrics

指定したグループにおける最小値、最大値、平均値などの統計値を計算する

avg

  • 数値型フィールドにおける平均値を計算
GET test_index/_search
{
  "size": 0,
  "query": {
    "match": {
      "message": "hello"
    }
  },
  "aggs": {
    "test": {
      "avg": {
        "field": "price"
      }
    }
  }
}

max

  • 数値型フィールドにおける最大値を計算
GET test_index/_search
{
  "size": 0,
  "query": {
    "match": {
      "message": "hello"
    }
  },
  "aggs": {
    "test": {
      "max": {
        "field": "price"
      }
    }
  }
}

min

  • 数値型フィールドにおける最小値を計算
GET test_index/_search
{
  "size": 0,
  "query": {
    "match": {
      "message": "hello"
    }
  },
  "aggs": {
    "test": {
      "min": {
        "field": "price"
      }
    }
  }
}

sum

  • 数値型フィールドにおける合計値を計算
GET test_index/_search
{
  "size": 0,
  "query": {
    "match": {
      "message": "hello"
    }
  },
  "aggs": {
    "test": {
      "sum": {
        "field": "price"
      }
    }
  }
}

cardinality

  • フィールドに格納されている値の種類の数の概算値
GET test_index/_search
{
  "size": 0,
  "query": {
    "match": {
      "message": "hello"
    }
  },
  "aggs": {
    "test": {
      "cardinality": {
        "field": "name.keyword"
      }
    }
  }
}

stats

  • count,min,max,avg,sumなど、複数の統計値が返される
GET test_index/_search
{
  "size": 0,
  "query": {
    "match": {
      "message": "hello"
    }
  },
  "aggs": {
    "test": {
      "stats": {
        "field": "name.keyword"
      }
    }
  }
}

Buckets

terms

  • 指定したフィールドの値ごとにグループを作成
GET test_index/_search
{
  "size": 0,
  "aggs": {
    "test": {
      "terms": {
        "field": "category.keyword",
	"size": 3
      }
    }
  }
}

range

  • 数値型のフィールドに対して値の範囲で分類する
GET test_index/_search
{
  "size": 0,
  "aggs": {
    "test": {
      "range": {
        "field": "price",
	"ranges": [
	  {
	    "to": 50
	  },
	  {
	    "from": 50,
	    "to": 100
	  },
	  {
	    "from": 100
	  }
	]
      }
    }
  }
}

date_range

  • date型のフィールドに対して値の範囲で分類する
GET test_index/_search
{
  "size": 0,
  "aggs": {
    "test": {
      "date_range": {
        "field": "date",
	"ranges": [
	  {
	    "from": "now-1y",
	    "to": "now-1M"
	  },
	  {
	    "from": "now-1M",
	    "to": "now"
	  }
	]
      }
    }
  }
}

histogram

  • 数値型のフィールドに対して、増分を指定してグループを分類する
GET test_index/_search
{
  "size": 0,
  "aggs": {
    "test": {
      "histogram": {
        "field": "price",
	"interval": 30
      }
    }
  }
}

Discussion