零からの

ゆるーく綴るブログ

Getting Started with Elasticsearch

ESを使用することになったので、このあたりを見ながら簡単にメモを残す。

環境構築

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を完全に理解した気になれる。

ここからは先は状況に応じてリファレンスをピックアップしていくのが良さそう。