如何真正重新索引elasticsearch中的数据

时间:2015-11-22 18:33:17

标签: elasticsearch reindex

我添加了新的映射(主要是现有字段的not_analyzed版本)我现在必须弄清楚如何重新索引现有数据。我试过按照弹性搜索网站上的指南,但这太混乱了。我也尝试过使用插件(elasticsearch-reindex,allegro / elasticsearch-reindex-tool)。 我看过ElasticSearch - Reindexing your data with zero downtime这是一个类似的问题。我希望不必依赖外部工具(如果可能)并尝试使用批量API(与原始插入一样)

我可以很容易地重建整个索引,因为它确实是一个只读数据但是如果我想在我用它生产时想要添加更多字段等,那么从长远来看它确实不会起作用。 我想知道是否有人知道一个易于理解/遵循的解决方案或相对新手ES的步骤。我在版本2并使用Windows。

3 个答案:

答案 0 :(得分:5)

重新索引意味着读取数据,删除elasticsearch中的数据并再次提取数据。没有像“改变现有数据的映射”这样的事情。您提到的所有重新索引工具都只是读取> delete->摄取的包装 您始终可以调整新索引的映射并稍后添加字段。将针对此映射索引所有新字段。如果您不控制新字段,请使用动态映射 请查看Change default mapping of string to "not analyzed" in Elasticsearch,了解如何使用动态映射获取字符串的not_analyzed字段。

重新编制索引非常昂贵。更好的方法是创建一个新索引并删除旧索引。要在零停机时间实现此目的,请为所有客户使用索引别名。想想一个名为“data-version1”的索引。步骤:

  • 创建索引“data-version1”并为其指定名为“data”的别名
  • 仅在所有客户端应用程序中使用别名“data”
  • 更新映射:创建一个名为“data-version2”的新索引(使用新映射)并将所有数据放入
  • 从version1切换到version2:删除版本1上的别名“data”并在版本2上创建别名“data”(或首先创建,然后删除)。在这两个步骤之间的时间,您的客户将没有(或双重)数据。但删除和创建别名之间的时间应该很短,客户不应该认出它。

总是使用别名是一种好习惯。

答案 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'