Elasticsearch
Docker
業務でElasticsearchを使用することになったので公式のガイドを見ながらDockerでかんたんに試してみたのでメモを残す。
Dockerを利用したのでdocker-compose.ymlを以下のように設定した。
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
container_name: elasticsearch
environment:
- TZ=Asia/Tokyo
- discovery.type=single-node
ports:
- 9200:9200
実行方法は以下。
docker-compose up -d
起動後したか確認する。
curl -XGET "http://localhost:9200/_cat/health?v"
ESではインデックスの中にドキュメント(データ)を登録していく。
※RDBのテーブル、レコードのようなイメージ
curl -XPUT "http://localhost:9200/customer?pretty"
curl -XGET "http://localhost:9200/_cat/indices?v"
curl -XDELETE "http://localhost:9200/customer?pretty"
すべてのインデックスを一括で削除することも可能。
curl -XDELETE "http://localhost:9200/*"
インデックス内に登録するデータをドキュメントと呼ぶ。
ホスト/インデックス/タイプ
の順で指定する。
タイプについては、ES7ではインデックスに複数のタイプが登録できないようなので、_doc固定で良いのかも。
curl -H "Content-Type: application/json" -XPOST "http://localhost:9200/customer/_doc?pretty" -d '{"customer": "John Doe"}'
なお、ホスト/インデックス/タイプ/ID
の順で指定することで登録することも可能。
この場合は、POSTでなくPUTとなる。
curl -H "Content-Type: application/json" -XPUT "http://localhost:9200/customer/_doc/1?pretty" -d '{"customer": "John Doe"}'
登録時のレスポンスに含まれる"_id"を指定する。
curl -XGET "http://localhost:9200/customer/_doc/<_idの値>?pretty"
登録時のレスポンスに含まれる"_id"を指定する。
curl -XDELETE "http://localhost:9200/customer/_doc/<_idの値>?pretty"
もちろん、大量データ登録も可能。
こちらからaccounts.jsonのデータをダウンロードして登録する。
curl -H "Content-Type: application/json" -XPOST "http://localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@accounts.json"
ESの醍醐味であろう検索。
Queryを駆使することで柔軟な検索が可能になる。
スペースで区切ることでOR検索が可能。
curl -H "Content-Type: application/json" -XGET "http://localhost:9200/bank/_search?pretty" -d '
{
"query": { "match": { "address": "mill lane" } }
}'
Boolean queryを使用すると複雑な検索も可能。
それぞれがTrueになるドキュメントを取得する。
詳細はこちら
curl -H "Content-Type: application/json" -XGET "http://localhost:9200/bank/_search?pretty" -d '
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}'
範囲指定はこうする。
curl -H "Content-Type: application/json" -XGET "http://localhost:9200/bank/_search?pretty" -d '
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}'
Groupingすることも可能。
curl -H "Content-Type: application/json" -XGET "http://localhost:9200/bank/_search?pretty" -d '
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}'
curl -H "Content-Type: application/json" -XGET "http://localhost:9200/bank/_search?pretty" -d '
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
]
}'
RDBのようにOFFSET, LIMITを指定することも可能。
curl -H "Content-Type: application/json" -XGET "http://localhost:9200/bank/_search?pretty" -d '
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
],
"from": 10,
"size": 10
}'
以上を知っておけばとりあえずESを完全に理解した気になれる。
ここからは先は状況に応じてリファレンスをピックアップしていくのが良さそう。