【问题标题】:Issues indexing data into elasticsearch in laravel在 laravel 中将数据索引到弹性搜索中的问题
【发布时间】:2017-03-29 06:05:53
【问题描述】:

我正在尝试将大约 47k 条记录的整个表索引到弹性搜索中。这不是很多数据。无论如何,我用 eloquent 对记录进行分块,无论块的大小,到 ES 控制台输出的第 5 个“update_mapping”,一切都停止了。

我不能 100% 确定您需要哪些信息来帮助调试此问题,因此我将尝试涵盖所有内容。

Laravel 5.2 托管在 vagrant 机器中,运行 Scotch-Vagrant 映像。

我正在使用来自弹性搜索的官方 docker 镜像:

docker run -p 9200:9200 -e "http.host=0.0.0.0" -e "transport.host=127.0.0.1" docker.elastic.co/elasticsearch/elasticsearch:5.2.1

要使用 ES,我使用的是他们的官方包。在我的 composer.json 中:

"elasticsearch/elasticsearch": "^5.1"

我使用本教程来启动和运行: https://michaelstivala.com/learning-elasticsearch-with-laravel/

(包括“加强”的包装。)

我在他的类中添加了一个方法,作为调试工作:

public function createIndex($params) {
    return $this->client->indices()->create($params);
}

我很快就会讲到 createIndex 方法。

我不得不修改他的Provider注册方法以包含主机信息:

public function register()
{

    $hosts = [
        [
            'host' => '10.0.2.2', // the host ip from inside vagrant
            'port' => '9200',
            'scheme' => 'http',
            'user' => 'elastic', // yeah I know, change this.
            'pass' => 'changeme' // I will.
        ]
    ];


    $this->app->bind(Elastic::class, function ($app) use ($hosts) {
        return new Elastic(
            ClientBuilder::create()
                ->setHosts($hosts)
                ->build()
        );
    });
}

有了这个,我的 laravel 项目启动并运行了 Elasticsearch。进入索引。

$elastic = app(Elastic::class);

// Table Causes has 84 records.
Causes::chunk(100, function ($causes) use ($elastic) {
    foreach ($causes as $cause) {
        $elastic->index([
            'index' => 'pwi',
            'type' => 'cause',
            'id' => $cause->cause_id,
            'body' => $cause->toArray()
        ]);
    }
});

// Table Country has 248 records.
Country::chunk(100, function ($countries) use ($elastic) {
    foreach ($countries as $country) {
        $elastic->index([
            'index' => 'pwi',
            'type' => 'country',
            'id' => $country->country_id,
            'body' => $country->toArray()
        ]);
    }
});

这些索引没有问题。现在是大的。

// Table Organizations has 47066 records.
Organizations::chunk(5000, function ($organizations) use ($elastic) {
    foreach ($organizations as $organization) {
        $elastic->index([
            'index' => 'pwi',
            'type' => 'organization',
            'id' => $organization->org_id,
            'body' => $organization->toArray()
        ]);
    }
});

当我使用上述配置运行所有三个索引时,这是我在 docker 控制台窗口中得到的输出

 [2017-03-28T19:22:11,305][INFO ][o.e.c.m.MetaDataCreateIndexService] [knre-px] [pwi] creating index, cause [auto(index api)], templates [], shards [5]/[1], mappings []
 [2017-03-28T19:22:11,443][INFO ][o.e.c.m.MetaDataMappingService] [knre-px] [pwi/Jswi4XuJTyqj56edsNfjfg] create_mapping [cause]
 [2017-03-28T19:22:16,190][INFO ][o.e.c.m.MetaDataMappingService] [knre-px] [pwi/Jswi4XuJTyqj56edsNfjfg] create_mapping [country]
 [2017-03-28T19:22:16,604][INFO ][o.e.c.m.MetaDataMappingService] [knre-px] [pwi/Jswi4XuJTyqj56edsNfjfg] update_mapping [country]
 [2017-03-28T19:22:29,088][INFO ][o.e.c.m.MetaDataMappingService] [knre-px] [pwi/Jswi4XuJTyqj56edsNfjfg] create_mapping [organization]
 [2017-03-28T19:22:29,375][INFO ][o.e.c.m.MetaDataMappingService] [knre-px] [pwi/Jswi4XuJTyqj56edsNfjfg] update_mapping [organization]
 [2017-03-28T19:22:29,453][INFO ][o.e.c.m.MetaDataMappingService] [knre-px] [pwi/Jswi4XuJTyqj56edsNfjfg] update_mapping [organization]
 [2017-03-28T19:22:30,309][INFO ][o.e.c.m.MetaDataMappingService] [knre-px] [pwi/Jswi4XuJTyqj56edsNfjfg] update_mapping [organization]
 [2017-03-28T19:22:30,717][INFO ][o.e.c.m.MetaDataMappingService] [knre-px] [pwi/Jswi4XuJTyqj56edsNfjfg] update_mapping [organization]
 [2017-03-28T19:22:33,247][INFO ][o.e.c.m.MetaDataMappingService] [knre-px] [pwi/Jswi4XuJTyqj56edsNfjfg] update_mapping [organization]

对于组织而言,无论块大小如何,它都会到达第 5 次更新映射,这就是一切停止的地方。 10 块或 5000 块相同的结果。浏览器窗口仍在旋转。控制台中永远不会有任何额外的输出。它就在那里,最终给了我最大执行时间超出错误。

在对我运行的任何内容编制索引之前,我已经尝试使用该 createIndex 方法增加分片数:

$params = [
    'index' => 'pwi',
    'body' => [
        'settings' => [
            'number_of_shards' => 10
        ],
    ]
];

$elastic->createIndex($params);

最终结果没有变化。

我在启动 docker 镜像时遇到了这个错误:

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

运行这个: sudo sysctl -w vm.max_map_count=262144

(https://github.com/docker-library/elasticsearch/issues/111) 解决了这个问题。

这不是数据的问题。如果块大小为 10,则不会卡在同一条记录上,下次尝试块大小为 5000。

我使用的是 Elasticquent 包(只有我必须使用 ES 2.4),并且在为组织表编制索引时遇到了同样的问题。虽然使用 200 块已经过去了(虽然不是当前的过程)。我需要跨类型搜索,但我找不到可以轻松做到这一点的包,所以我决定自己做。如果我取消索引请求,然后开始使用我的搜索代码(不索引任何内容,只使用已索引的内容)一切都很好!

如果我是赌徒,我会说我的配置有问题。或者 ES/Docker 服务器。不幸的是,我不知道要谷歌什么。 47k 的记录并不多……对吧?那我错过了什么?

感谢您阅读所有这些内容。感谢您的帮助。

[编辑]

我改了代码:

Organizations::chunk(200, function ($organizations) use ($elastic) {
    foreach ($organizations as $organization) {
        $elastic->index([
            'index' => 'pwi',
            'type' => 'organization',
            'id' => $organization->org_id,
            'body' => [
                "org_name" => $organization->org_name,
                "org_desc" => $organization->org_desc,
            ]
        ]);
    }
});

现在它没有通过第一个创建地图:

[2017-03-28T20:00:14,543][INFO ][o.e.c.m.MetaDataCreateIndexService] [eBlAEK7] [pwi] creating index, cause [auto(index api)], templates [], shards [5]/[1], mappings []
[2017-03-28T20:00:14,668][INFO ][o.e.c.m.MetaDataMappingService] [eBlAEK7] [pwi/Fqj91gS9Q6CBfl4z2ZNvXw] create_mapping [organization]

【问题讨论】:

    标签: php laravel elasticsearch


    【解决方案1】:

    临时解决方案是增加执行时间。

    ini_set('max_execution_time', 600); 
    

    vagrant 可能就这么慢吗?索引这 47k 条记录需要 8 分钟。

    无论如何,这是一个解决方案。我觉得不是最好的?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2016-08-12
      • 2016-03-13
      • 2021-03-18
      • 1970-01-01
      相关资源
      最近更新 更多