Elasticsearchで普段よく利用するコマンドやクエリの覚書です。
これまで手元のメモ帳に残していましたが増えてきたのでそのままこちらへメモしておきます。
ElasticsearchのAPIを利用した基本操作やアップグレードなどの運用方法。その他、Elasticsearchに関する参考情報をまとめています。
Elasticsearchは7系を使ってます。
目次
スポンサーリンク
インデックスの操作
Elasticsearchの操作には言語別の専用クライアントやkibanaがあるが、LInuxのcurlコマンドで操作するのが何だかんだで楽。
クエリに pretty を付けておくとレスポンスが見やすい。
インデックス一覧の確認
curl -XGET localhost:9200/_cat/indices?v
インデックス作成
curl -XPUT -H 'Content-Type: application/json' localhost:9200/myindex-1?pretty
インデックス削除
curl -XDELETE localhost:9200/myindex-1?pretty
再インデックス処理
curl -XPOST -H 'Content-Type: application/json' localhost:9200/_reindex?pretty -d ' { "source":{ "index":"myindex-1" }, "dest":{ "index":"myindex-2" } }'
インデックスの設定更新
インデックスの設定を変更した場合に行う操作。インデックス単位のリロードみたいなもの。
_close → _settings → _open の順に実行。
curl -XPOST -H 'Content-Type: application/json' localhost:9200/myindex-1/_close?pretty curl -XPUT -H 'Content-Type: application/json' localhost:9200/myindex-1/_settings?pretty curl -XPOST -H 'Content-Type: application/json' localhost:9200/myindex-1/_open?pretty
インデックスのマッピング設定を確認
curl -XGET localhost:9200/myindex-1/_mapping?pretty
テンプレートの操作
テンプレート登録
インデックスの設定はテンプレート化しファイルに保存しておくと管理しやすい。
curl -XPUT -H 'Content-Type: application/json' localhost:9200/_template/myindex_template?pretty -d @myindex.json
登録されているテンプレートの一覧
curl -XGET localhost:9200/_template/?pretty
テンプレート削除
curl -XDELETE localhost:9200/_template/myindex_template?pretty
エイリアスの操作
インデックスにはエイリアス名を設定する事ができる。
アプリケーション側の参照にこのエイリアス名を設定しておけば、インデックスの切り替えも無停止でできる。
エイリアスの設定
curl -XPUT -H 'Content-Type: application/json' localhost:9200/myindex-1/_alias/myindex?pretty
エイリアスの確認
curl -XGET localhost:9200/myindex/_alias?pretty
全エイリアスを確認する場合。
curl -XGET localhost:9200/*/_alias?pretty
エイリアスの削除
インデックス myindex-1 に設定されているエイリアス名 myindex を削除する例。
curl -XDELETE -H 'Content-Type: application/json' localhost:9200/myindex-1/_alias/myindex?pretty
エイリアスの切り替え
myindex-1 から myindex-2 へエイリアスを付け替える例。こうすると無停止でインデックスを切り替えることが出来る。
curl -H "Content-Type: application/json" -XPOST localhost:9200/_aliases?pretty -d ' { "actions" : [ { "add" : { "index" : "myindex-2", "alias" : "myindex" } }, { "remove" : { "index" : "myindex-1", "alias" : "myindex" } } ] }'
その他の操作
検索する
検索クエリをチューニングする時は補完機能があるkibanaの方がやりやすいかも。
curl -XGET localhost:9200/myindex-1/_search?pretty
ドキュメント削除
<_id> の部分にドキュメントのIDを指定する。
curl -XDELETE -H 'Content-Type: application/json' localhost:9200/myindex-1/_doc/<_id>?pretty
ダンプ&リストア
別のサーバへインデックスを丸ごとコピーしたい場合はこの順に作業する。
インストール手順にあるelasticsearch.ymlへの出力先ディレクトリの設定が必要。
- インデックスをダンプする
- 固めて新しいサーバへ転送する
- 新しいサーバで展開しリストアする
ダンプ
curl -XPUT 'localhost:9200/_snapshot/snapshot-1?pretty' -H 'Content-Type: application/json' -d' { "type": "fs", "settings": { "location": "/home/elasticsearch", "compress": true } }'
curl -XPUT 'localhost:9200/_snapshot/snapshot-1/snapshot-20191201?pretty&wait_for_completion=true' -H 'Content-Type: application/json' -d '{ "indices": "myindex-1, myindex-2, myindex-3", "ignore_unavailable": "true", "include_global_state": false }'
全てダンプする場合は indices にアスタリスクを指定。
indices": "*"
ダンプデータは固めて転送する。
$ cd /home $ sudo tar cfzp elasticsearch.tgz elasticsearch $ scp elasticsearch.tgz user@newhost:
リストア
ダンプデータを解凍して配置。ダンプデータはユーザー権限が elasticsearch になっている事を確認する。
$ cd /home $ sudo tar xfzp elasticsearch.tgz $ ll drwxr-xr-x 3 elasticsearch elasticsearch 4096 Dec 1 10:58 elasticsearch
旧サーバと uid や gid が違うなら chown しておく。
$ sudo chown -R elasticsearch:elasticsearch /home/elasticsearch
curl -XPUT 'localhost:9200/_snapshot/snapshot-1?pretty' -H 'Content-Type: application/json' -d' { "type": "fs", "settings": { "location": "/home/elasticsearch", "compress": true } }'
curl -XPOST 'localhost:9200/_snapshot/snapshot-1/snapshot-20191201/_restore?wait_for_completion=true&pretty' -H 'Content-Type: application/json' -d ' { "indices": "myindex-1, myindex-2, myindex-3" }'
Elasticsearchのインストールと初期設定
インストール
CentOS7にインストール例。Elasticsearchはyumでインストールが可能。
# vi /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-7.x] name=Elasticsearch repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch # yum install elasticsearch kibana
プラグインのインストール
# /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu # /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
# /usr/share/elasticsearch/bin/elasticsearch-plugin list
プラグインのアンインストール
# /usr/share/elasticsearch/bin/elasticsearch-plugin remove <pluginname>
メモリの設定
# vi /etc/elasticsearch/jvm.options
# Xms represents the initial size of total heap space # Xmx represents the maximum size of total heap space -Xms1g -Xmx1g
ダンプデータの出力先を設定
# vi /etc/elasticsearch/elasticsearch.yml
path.repo: ["/home/elasticsearch"]
Elasticsearchのアップグレード
- シャードの再配置を無効化
- 不要なインデクシングを停止
- Elasticsearch&kibanaの停止
- 各種アップグレード
- Elasticsearch&kibanaの起動
- シャードの再配置を有効化する
Elasticsearchをクラスタ構成にしている場合は全ノードでこの作業を繰り返す。
シャードの再配置を無効化
curl -XPUT -H 'Content-Type: application/json' localhost:9200/_cluster/settings?pretty -d ' { "persistent": { "cluster.routing.allocation.enable": "primaries" } }'
応答
{ "acknowledged" : true, "persistent" : { "cluster" : { "routing" : { "allocation" : { "enable" : "primaries" } } } }, "transient" : { } }
不要なインデクシングを停止
curl -X POST localhost:9200/_flush/synced?pretty
応答
{ "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "myindex-1" : { "total" : 3, "successful" : 3, "failed" : 0 } }
Elasticsearch&kibanaの停止
# systemctl stop elasticsearch # systemctl stop kibana
アップグレード
# yum update elasticsearch kibana
# /usr/share/elasticsearch/bin/elasticsearch-plugin remove analysis-icu # /usr/share/elasticsearch/bin/elasticsearch-plugin remove analysis-kuromoji # /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu # /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
Elasticsearch&kibanaの起動
# systemctl daemon-reload # systemctl start elasticsearch # systemctl start kibana
curl -XGET localhost:9200
応答
{ "name" : "example.com", "cluster_name" : "elasticsearch", "cluster_uuid" : "vBouUFilTpKKaZoAyyvxnA", "version" : { "number" : "7.5.0", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "e9ccaed468e2fac2275a3761849cbee64b39519f", "build_date" : "2019-11-26T01:06:52.518245Z", "build_snapshot" : false, "lucene_version" : "8.3.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
シャードの再配置を有効化する
curl -XPUT -H 'Content-Type: application/json' localhost:9200/_cluster/settings?pretty -d ' { "persistent": { "cluster.routing.allocation.enable": null } }'
応答
{ "acknowledged" : true, "persistent" : { }, "transient" : { } }
Elasticsearchの運用で覚えておきたい事
Pythonからは専用のクライアントを使うと操作が楽
テンプレートの設定方法など
日本語の検索は形態素解析とN-Gramのハイブリッド型がいいみたい。
検索順位のチューニング
Elasticsearchで文章の類似度をベクトル検索
類似した文章を探すならベクトル検索が結構いい感じに使える。
しっかりと前処理をした独自データでWord2Vecのモデルを構築すると尚良い。とにかく、前処理は重要。
Elasticsearchにサジェスト機能を実装
2台でHA構成にするとスプリットブレインを起こす
2台構成だとスプリットブレインを起こすので、Elasticsearchでクラスタリングしたい場合は3台以上で構成する必要があるらしい。