私は方法を見つけたと思います.ElasticSearchをよく知っている人がそれがうまく機能することを確認できれば、それは素晴らしいことです.
この記事を読んだばかりで、最後のセクションから次のアイデアが思い浮かびました。
http://www.elasticsearch.org/blog/changeing-mapping-with-zero-downtime/
アイデアは、先頭で同じインデックス (index_1 と呼びましょう) を指す 2 つのエイリアス (index_search と index_write) を作成することです。ある日、index_1 のシャードの数が十分ではないと想像してください。この場合、同じマッピングとシャードの数で新しいインデックス (index_2 と呼びましょう) を作成できます。できたかもしれません。
次に、エイリアス index_search を更新して、"index_1, index_2" (index_1 と index_2 の両方) を指すようにします。これにより、2 つのインデックスで検索が行われるようになります。次に、index_write を index_2 に更新します。これにより、index_1 のシャードがいっぱいであると見なされるため、新しいシャードに対してのみ書き込みが行われます。
将来的には、新しいインデックス (index_3) を追加し、index_search を「index_1、index_2、index_3」にマップすることができます。
もちろん、私たちのアプリケーションでは常にエイリアスを使用し、そのようなインデックスの実際の名前は決して使用しません。変換はアプリケーションからは見えず、アプリケーションのコードを変更する必要はありません。
センス構文を使用した例:
PUT index_1
{
"settings": {
"number_of_shards": 1
}
}
POST _aliases
{
"actions": [
{
"add": {
"index": "index_1",
"alias": "index_search"
}
},
{
"add": {
"index": "index_1",
"alias": "index_write"
}
}
]
}
PUT index_write/article/1
{
"title":"One first index",
"article":"This is an article that is indexed on index_1"
}
PUT index_2
{
"settings": {
"number_of_shards": 2
}
}
POST _aliases
{
"actions": [
{
"add": {
"index": "index_2",
"alias": "index_search"
}
},
{
"add": {
"index": "index_2",
"alias": "index_write"
}
},
{
"remove": {
"index": "index_1",
"alias": "index_write"
}
}
]
}
PUT index_write/article/2
{
"title":"One second index",
"article":"This is an article that is indexed on index_2"
}
この解決策の問題点は、index_write が index_2 をポイントしているときに index_1 のドキュメントを更新すると、そのコピーが作成されることです。これは、実際のインデックスを見つけるために、更新する前に検索する必要があることを意味します。さらに、id one index_write で GET コマンドを使用することはできません。