我使用映射创建了一个新索引。其中存储了500 000个文件。
我想改变索引的映射,但是在弹性搜索中是不可能的。所以我用新的新映射创建了另一个索引,现在我正在尝试将文档从旧索引复制到新索引。
我使用扫描和滚动类型从旧索引中检索文档并复制到新索引。复制它需要更多时间,系统正在减速。
以下是我正在使用的代码。
$client= app('elastic_search');
$params = [
"search_type" => "scan", // use search_type=scan
"scroll" => "30s", // how long between scroll requests. should be small!
"size" => 500000, // how many results *per shard* you want back
"index" => "admin_logs422",
"body" => [
"query" => [
"match_all" => []
]
]
];
$docs = $client->search($params); // Execute the search
$scroll_id = $docs['_scroll_id'];
while (\true) {
// Execute a Scroll request
$response = $client->scroll([
"scroll_id" => $scroll_id, //...using our previously obtained _scroll_id
"scroll" => "500s" // and the same timeout window
]
);
if (count($response['hits']['hits']) > 0) {
foreach($response['hits']['hits'] as $s)
{
$params =
[
'index' => 'admin_logs421',
'type' => 'admin_type421',
'id'=> $s['_id'],
'client' => [
'ignore' => [400, 404],
'verbose' => true,
'timeout' => 10,
'connect_timeout' => 10
],
'body' => $s['_source']
];
$response = app('elastic_search')->create($params);
}
$scroll_id = $response['_scroll_id'];
} else {
// No results, scroll cursor is empty. You've exported all the data
return response("completed");
}
}
答案 0 :(得分:4)
你不应该像那样编写代码。有一些很好的工具可以帮到你。
只需看看Taskrabbit's elasticdump实用程序,它可以完全满足您的需求。
elasticdump \
--input=http://localhost:9200/source_index \
--output=http://localhost:9200/target_index \
--type=data
或者您也可以非常轻松地利用Logstash,如this other answer
所示最后,既然你正在使用Python,你也可以使用elasticsearch-py reindex utility
答案 1 :(得分:0)
您可以尝试使用一些现有的重建索引插件
https://github.com/codelibs/elasticsearch-reindexing
发送以下请求
localhost:9200/{fromindex}/{fromtype}/_reindex/{toindex}/{totype}