前回はグラフDBのNeo4jを使ってみました。
DB関連つながりで、今回はElasticSearchを使ってみたいと思います。 導入と、基本的な触り方の覚え書きです。
ElasticSearchとは
ものすごく有名ですし、あんまり説明はいらないかと思います。 一応公式ページにはこんな感じで書いてあります。
Elasticsearchは、様々なユースケースを解決する分散型RESTful検索/分析エンジンです。予期した結果や、そうでないものも検索できるようにデータを集めて格納するElastic Stackのコア製品です。
(出典:ElasticSearch HP)
全文検索エンジンなので、RDBとは毛色が違います。 まあ細かいことは置いておいて、使ってみたほうが実感湧くと思うので、紹介はこのくらいで。
環境構築
Docker
Dockerで環境構築する場合にはこの辺が参考になるかと思います。コンテナのサイズを大きくしたくないので、ストレージをローカル環境にマウントするように設定します。
公式で提供しているベースイメージは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
これで起動しました。 正常に起動しているかの確認のためヘルスチェックを投げてみます。
こんな画面になってれば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の公式のチュートリアルがこちら。
こちらを確認すれば基本的な操作は充足するはず。
dockerが起動したら、ElasticSearch + Kibanaが使えるようになっているので、Kibanaにアクセスします。
(Kibanaへアクセス) https://localhost:5601
あとはチュートリアルを見ながらやっていけば大体のことは出来ると思います。 一応使いそうなのだけメモっておきます。
用語の説明
- インデックス
- ElasticSearchが検索する保存先
- インデックスする : 「検索対象を登録する」
- 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" } }
感想
とりあえず動いたし、中身も見えていたので使えそうですね。 こちらも文法は全くわからないので、使いながら覚えていきたいと思います。