我添加了新的映射(主要是现有字段的not_analyzed版本)我现在必须弄清楚如何重新索引现有数据。我试过按照弹性搜索网站上的指南,但这太混乱了。我也尝试过使用插件(elasticsearch-reindex,allegro / elasticsearch-reindex-tool)。 我看过ElasticSearch - Reindexing your data with zero downtime这是一个类似的问题。我希望不必依赖外部工具(如果可能)并尝试使用批量API(与原始插入一样)
我可以很容易地重建整个索引,因为它确实是一个只读数据但是如果我想在我用它生产时想要添加更多字段等,那么从长远来看它确实不会起作用。 我想知道是否有人知道一个易于理解/遵循的解决方案或相对新手ES的步骤。我在版本2并使用Windows。
答案 0 :(得分:5)
重新索引意味着读取数据,删除elasticsearch中的数据并再次提取数据。没有像“改变现有数据的映射”这样的事情。您提到的所有重新索引工具都只是读取> delete->摄取的包装 您始终可以调整新索引的映射并稍后添加字段。将针对此映射索引所有新字段。如果您不控制新字段,请使用动态映射 请查看Change default mapping of string to "not analyzed" in Elasticsearch,了解如何使用动态映射获取字符串的not_analyzed字段。
重新编制索引非常昂贵。更好的方法是创建一个新索引并删除旧索引。要在零停机时间实现此目的,请为所有客户使用索引别名。想想一个名为“data-version1”的索引。步骤:
总是使用别名是一种好习惯。
答案 1 :(得分:1)
使用2.3.4版本,可以使用新的api _reindex,它可以完全按照它所说的那样做。基本用法是
{
"source": {
"index": "currentIndex"
},
"dest": {
"index": "newIndex"
}
}
答案 2 :(得分:0)
Elasticsearch Reindex从Remote
主机到Local
主机示例(2020年1月更新)
# 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'