web-dev-qa-db-ja.com

elasticsearchでデータを実際に再インデックスする方法

新しいマッピング(主に既存のフィールドのnot_analyzedバージョン)を追加しました。ここで、既存のデータのインデックスを再作成する方法を理解する必要があります。弾性検索ウェブサイトのガイドを試してみましたが、それはあまりにも混乱しすぎです。また、プラグイン(elasticsearch-reindex、allegro/elasticsearch-reindex-tool)を使用してみました。私は ElasticSearch-ダウンタイムなしでデータを再インデックスする を見てきましたが、これは同様の質問です。 (可能な場合は)外部ツールに依存せずに(元の挿入の場合と同様に)バルクAPIを使用する必要がないことを望んでいました

実際には読み取り専用のデータなので、インデックス全体を簡単に再構築できますが、運用中にフィールドなどを追加する必要がある場合、長期的には機能しません。 ESの比較的初心者のための理解しやすい/フォローしやすい解決策または手順を知っている人がいるのではないかと思いました。バージョン2でWindowsを使用しています。

14
metase

バージョン2.3.4では、新しいapi _reindexが使用可能になり、それが正確にそれを実行します。基本的な使い方は

{
    "source": {
        "index": "currentIndex"
    },
    "dest": {
        "index": "newIndex"
    }
}
4
metase

再インデックス付けとは、データを読み取り、elasticsearchでデータを削除して、再度データを取り込むことを意味します。 「既存のデータのマッピングを適切に変更する」ようなものはありません。あなたが言及したすべてのインデックス再作成ツールは、read-> delete-> ingestのラッパーにすぎません。
いつでも新しいインデックスのマッピングを調整し、後でフィールドを追加できます。このマッピングに関して、すべての新しいフィールドにインデックスが付けられます。または、新しいフィールドを制御できない場合は、動的マッピングを使用します。
Elasticsearchで文字列のデフォルトマッピングを「未分析」に変更 を見て、動的マッピングを使用して文字列のnot_analyzedフィールドを取得する方法を確認してください。

再インデックスは非常にコストがかかります。より良い方法は、新しいインデックスを作成して古いインデックスを削除することです。ダウンタイムなしでこれを実現するには、すべての顧客にインデックスエイリアスを使用します。 「data-version1」と呼ばれるインデックスを考えてください。段階的に:

  • インデックス「data-version1」を作成し、「data」という名前のエイリアスを割り当てます
  • すべてのクライアントアプリケーションでエイリアス「データ」のみを使用する
  • マッピングを更新するには、「data-version2」という新しいインデックスを(新しいマッピングで)作成し、すべてのデータを
  • バージョン1からバージョン2に切り替えるには、バージョン1にエイリアス「データ」をドロップし、バージョン2にエイリアス「データ」を作成します(または最初に作成してからドロップします)。これら2つのステップの間の時間は、クライアントにデータがない(または2倍になる)ことになります。ただし、エイリアスを削除してから作成するまでの時間は、クライアントが認識できないほど短いはずです。

常にエイリアスを使用することをお勧めします。

12
dtrv

私も同じ問題に直面しました。しかし、現在のインデックスマッピングとアナライザーを更新するためのリソースが見つかりませんでした。私の提案は scroll and scan api を使用し、新しいマッピングと新しいフィールドでデータを新しいインデックスに再インデックスすることです。

0
mehmet.onler

Elasticsearch Reindex from Remote Host to Local Host example(Jan 2020 Update)

# show indices on this Host
curl 'localhost:9200/_cat/indices?v'

# edit elasticsearch configuration file to allow remote indexing
Sudo vi /etc/elasticsearch/elasticsearch.yml

## copy the line below somewhere in the file
>>>
# --- whitelist for remote indexing ---
reindex.remote.whitelist: my-remote-machine.my-domain.com:9200
<<<

# restart elaticsearch service
Sudo systemctl restart elasticsearch

# run reindex from remote machine to copy the index named filebeat-2016.12.01
curl -H 'Content-Type: application/json' -X POST 127.0.0.1:9200/_reindex?pretty -d'{
  "source": {
    "remote": {
      "Host": "http://my-remote-machine.my-domain.com:9200"
    },
    "index": "filebeat-2016.12.01"
  },
  "dest": {
    "index": "filebeat-2016.12.01"
  }
}'

# verify index has been copied
curl 'localhost:9200/_cat/indices?v'
0
smack cherry