【发布时间】: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