📖
Elasticsearchの基本クエリのざっくりしたまとめ
久しぶりに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