如何将一个索引文档复制到elasticsearch中的其他索引?

时间:2016-01-21 10:49:10

标签: elasticsearch

我使用映射创建了一个新索引。其中存储了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");
        }
    }

2 个答案:

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