GAミント至上主義

Web Monomaniacal Developer.

ElasticsearchをローカルDocker開発環境で動かす

シニアジョブの人材管理システムでは、全文検索エンジンとしてElasticsearchを使っています。

Elasticsearchは業務で直接触るのは初めての初心者です。
昔はElasticSearchと思っていたり、Elasticって付いてるからAWSのサービスかーとか思ってた。

基本的に開発環境はDocker化したんですが、Elasticsearchは開発でもAWSに用意した1つを共用したままとなっていました。
1人のときはいいですが複数となると不整合が出て支障が出始めたのでローカル化しました。

バージョンとイメージ

AWSAmazon Elasticsearch Service ダッシュボードで、現在使っているバージョンを確認したところ6.7となっていました。
近いうちに7へのバージョンアップは必要ですが一旦それに合わせる形で近い6.8.6を使用しました(メジャーバージョン同じなら動くやろ)。

https://hub.docker.com/_/elasticsearch?tab=tags

Laravelとの連携

Laravel Scoutというのを使ってます。使用するindex名はそのままscout。
Algoliaもそのまま使えるんだなぁ。

readouble.com

docker-compose.yml

公式イメージで特に問題なさそうなのでDockerfileはなし。
docker-compose.ymlへの追加とデータ保持用にディレクトリだけ作っておきます。

version: '3'

services:
  app:
    container_name: app
    build:
      context: ./
      dockerfile: ./Dockerfiles/app/Dockerfile
    environment:
      - TZ=Asia/Tokyo
    depends_on:
      - elasticsearch

 # 省略

  elasticsearch:
    container_name: elasticsearch
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.6
    volumes:
      - ./Dockerfiles/elasticsearch/data:/usr/share/elasticsearch/data
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"

index の設定をjsonで書き出す

mappingとsettingsの設定が必要な場合は、jsonで出力しておきます。
今回すでにあるのを使ったのでやってないけど、たぶん普通にindex名にGETして返ってきたのから不要なの(uuidとかversionとか)を消して使えばいいと思う(てきとー)。

curl -XGET "https://elasticsearch-host/scout?pretty"  > create_index.json

jsonを利用してindex作成

docker-compose upで起動したら、上記で出力したjsonを元にindexを作成します。

curl -XPUT "http://localhost:9200/scout?pretty" -H "Content-type: application/json" -d @./path/to/create_index.json

反映コマンドでDB→Elasticsearchにインポート

インポートはartisan scout:importを使ってもできますが、特殊な処理がいるので独自に実装してるのでこんな感じ。

docker-compose exec app php artisan reflect:elasticsearch

最初mappingとsettingsはあとでいいだろーと先にインポートをやってしまいましたが、後からは変更できないので、DELETEして再度やり直しが必要になりました。

現在開発用のDBデータも数十GBあり、初回読み込みには2時間ぐらいかかり、MacBook Proのファンが全開でした。

所感

Dockerで起動後は実質2コマンドであっけなく動いてしまいました。よくできてる。
とりあえずシングルノードだけど、これならKubernetes で分散させるのも簡単そう。

Elasticsearch実践ガイド (impress top gear)

Elasticsearch実践ガイド (impress top gear)