どこにでもいるSEの備忘録

たぶん動くと思うからリリースしようぜ

ElasticSearch導入の覚え書き

f:id:nogawanogawa:20190209121544j:plain

前回はグラフDBのNeo4jを使ってみました。

nogawanogawa.hatenablog.com

DB関連つながりで、今回はElasticSearchを使ってみたいと思います。 導入と、基本的な触り方の覚え書きです。

ElasticSearchとは

ものすごく有名ですし、あんまり説明はいらないかと思います。 一応公式ページにはこんな感じで書いてあります。

Elasticsearchは、様々なユースケースを解決する分散型RESTful検索/分析エンジンです。予期した結果や、そうでないものも検索できるようにデータを集めて格納するElastic Stackのコア製品です。

(出典:ElasticSearch HP)

www.elastic.co

全文検索エンジンなので、RDBとは毛色が違います。 まあ細かいことは置いておいて、使ってみたほうが実感湧くと思うので、紹介はこのくらいで。

環境構築

Docker

Dockerで環境構築する場合にはこの辺が参考になるかと思います。コンテナのサイズを大きくしたくないので、ストレージをローカル環境にマウントするように設定します。

www.elastic.co

tech.innovation.co.jp

公式で提供しているベースイメージはcentos:7みたいですね。 まあ、RESTfulなんで、基本的には外からアクセスするだけで事足りるとは思いますので、OSは今は気にする必要はないかもしれないですね。

手順

まずこんな感じのフォルダ構成にします

.
├── Elasticsearch
│   └── Dockerfile
├── Kibana
│   └── Dockerfile
└── docker-compose.yml

次に必要なファイルをの内容を書いていきます。

docker-compose.yml
version: '2'
services:
  elasticsearch:
    build: elasticsearch
    volumes:
        - <host dir>:/usr/share/elasticsearch/data
    ports:
        - 9200:9200
    expose:
        - 9300
  kibana:
    build: kibana
    ports:
        - 5601:5601

volumes:
    elasticsearch-data:
        driver: local
Dockerfile(ElasticSearch)
FROM docker.elastic.co/elasticsearch/elasticsearch:6.6.0

RUN elasticsearch-plugin install analysis-kuromoji
Dockerfile(Kibana)
FROM docker.elastic.co/kibana/kibana:6.6.0
起動

composeします。

docker-compose up

これで起動しました。 正常に起動しているかの確認のためヘルスチェックを投げてみます。

curl http://localhost:9200/_cat/health?v

こんな画面になってればOKです。

epoch      timestamp cluster        status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1549688347 04:59:07  docker-cluster green           1         1      1   1    0    0        0             0                  -                100.0%

使い方

Elasticsearch SQLの公式のチュートリアルがこちら。

www.elastic.co

こちらを確認すれば基本的な操作は充足するはず。

dockerが起動したら、ElasticSearch + Kibanaが使えるようになっているので、Kibanaにアクセスします。

(Kibanaへアクセス) https://localhost:5601

あとはチュートリアルを見ながらやっていけば大体のことは出来ると思います。 一応使いそうなのだけメモっておきます。

用語の説明

  • インデックス
    • ElasticSearchが検索する保存先
      • インデックスする : 「検索対象を登録する」
  • ドキュメント
    • ElasticSearchに登録されたデータ
  • フィールド
    • ドキュメントに含まれる属性
  • クエリ
    • 検索条件、検索式

クエリの書き方

  • 基本形式
    • (メソッド) /(インデックス名)/(タイプ名)(ドキュメント名) {json}

(例)

PUT /library/doc/1
{
  "title": "Norweign wood",
  "name": {
    "first": "Haruki",
    "last" :"murakami"
  }
}

(例:curl)

curl -XPUT "http://localhost:9200/library/doc/1" -H 'Content-Type: application/json' -d'
{
  "title": "Norweign wood",
  "name": {
    "first": "Haruki",
    "last" :"murakami"
  }
}'

(応答例)

{
  "_index" : "library",
  "_type" : "doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

検索

こんな感じです。

curl -XGET "http://localhost:9200/library/doc/1" -H 'Content-Type: application/json' -d'
{
  "query" : {
    "simple_query_string" : {
      "query": "murakami",
      "fields": ["_all"],
      "default_operator": "and"
    }
  }
}'

応答はこんな感じ。

{"_index":"library","_type":"doc","_id":"1","_version":3,"_seq_no":2,"_primary_term":1,"found":true,"_source":{
  "query" : {
    "simple_query_string" : {
      "query": "murakami",
      "fields": ["_all"],
      "default_operator": "and"
    }
  }

感想

とりあえず動いたし、中身も見えていたので使えそうですね。 こちらも文法は全くわからないので、使いながら覚えていきたいと思います。