当前位置: 首页 > 面试题库 >

如何在elasticsearch中将一个索引文档复制到另一索引?

方寒
2023-03-14
问题内容

我用映射创建了一个新索引。其中存储了500 000个文档。

我想更改索引的映射,但是在elasticsearch中是不可能的。所以我用新的新映射创建了另一个索引,现在我正尝试将文档从旧索引复制到新索引。

我正在使用扫描和滚动类型从旧索引中检索文档并将其复制到新索引。复制需要花费更多时间,并且系统运行缓慢。

下面是我正在使用的代码。

$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");
        }
    }

问题答案:

您不必编写类似的代码。周围有一些出色的工具可以帮助您。

只需看看Taskrabbit的elasticdump实用程序,它就能完全满足您的需求。

elasticdump \
  --input=http://localhost:9200/source_index \
  --output=http://localhost:9200/target_index \
  --type=data

最后,由于您使用的是Python,因此您还可以使用elasticsearch-py reindex实用程序



 类似资料:
  • 例如:来自https://localhost:9200将索引“index_name”设置为https://localhost:9300对于索引“index2_name” 建议在复制数据之前使用映射,映射文章:https://www.elastic.co/guide/en/elasticsearch/reference/current/explicit-mapping.html

  • 问题内容: 假设我的ElasticSearch中有电影数据,并且我这样创建它们: 我有一堆不同年代的电影。我想复制特定年份(即1972年)中的所有电影,然后将它们复制到新的索引“ 70sMovies”,但是我看不到该怎么做。 问题答案: 从ElasticSearch 2.3开始,您现在可以使用内置的API 例如: 或仅通过添加过滤器/查询的特定部分 了解更多:https://www.elastic

  • 假设我的ElasticSearch中有电影数据,我创建了它们,如下所示: 我有很多不同年代的电影。我想复制某一年(1972年)的所有电影,并将它们复制到一个新的索引“70sMovies”,但我不知道怎么做。

  • 问题内容: 自几个月前以来,我的集群每天都有一个索引,每个索引有5个分片(默认),并且由于分片太多(超过1000个),我无法在整个集群上运行查询。 文档ID是自动生成的。 如何将索引合并为一个索引,处理有冲突的ID(甚至可能发生冲突)并更改类型? 我正在使用ES版本5.2.1 问题答案: 仅在使用ELK堆栈几个月并逐日创建索引后才可见的常见问题。这里有一些选项可以解决性能问题。 首先,您可以用来限

  • 我知道有一种方法可以实现db。收集getIndexes(),它将列出为集合定义的所有索引。有没有办法将这些索引定义复制并创建到另一个集合? 有很多,我不想一个接一个地做。 关于重复的问题评论:我不希望复制收藏。我希望以可以应用于另一个集合的格式导出索引。

  • 我使用的是spring-data-elasticsearch,一开始一切都很好。 是否可以在运行时使用不同的索引创建存储库? 多谢了,马塞尔