work.log

元エンジニアの備忘録的ブログ

Elasticsearchでよく利用するAPIや操作方法の私的メモ

投稿:

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への出力先ディレクトリの設定が必要。

  1. インデックスをダンプする
  2. 固めて新しいサーバへ転送する
  3. 新しいサーバで展開しリストアする

ダンプ

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のアップグレード

  1. シャードの再配置を無効化
  2. 不要なインデクシングを停止
  3. Elasticsearch&kibanaの停止
  4. 各種アップグレード
  5. Elasticsearch&kibanaの起動
  6. シャードの再配置を有効化する

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からは専用のクライアントを使うと操作が楽

参考にしたページ
Python Elasticsearch Client

テンプレートの設定方法など

日本語の検索は形態素解析とN-Gramのハイブリッド型がいいみたい。

検索順位のチューニング

Elasticsearchで文章の類似度をベクトル検索

類似した文章を探すならベクトル検索が結構いい感じに使える。

しっかりと前処理をした独自データでWord2Vecのモデルを構築すると尚良い。とにかく、前処理は重要。

Elasticsearchにサジェスト機能を実装

2台でHA構成にするとスプリットブレインを起こす

2台構成だとスプリットブレインを起こすので、Elasticsearchでクラスタリングしたい場合は3台以上で構成する必要があるらしい。

スポンサーリンク

コメント

コメントを残す

よく読まれている記事

  • 本日
  • 週間
  • 月間