代码之家  ›  专栏  ›  技术社区  ›  TheDevWay

从postgreSQL到Elasticsearch的海量数据索引(约1200万行)非常缓慢

  •  1
  • TheDevWay  · 技术社区  · 6 年前

    postgreSQL 而我正试图带来 Elasticsearch (指数据)进入弹性搜索。问题是它的速度非常慢,需要大约 仅仅 280 000 数据行。

    26天 不停地完成此表的索引( 拥有1200万条记录 ).

    是否有可能以某种方式优化此方法并创建更快的方法?这就是我目前正在做的:

    public function run()
        {
            $es_client = new \Elastica\Client();
            $es_index = $es_client->getIndex("vehicle");
            $es_type = $es_index->getType("_doc");
    
            $vehicle_ins = new Vehicle;
    
            $step = 1000;
            $min_vehicle_id = $vehicle_ins->query()->min('id');
            $max_vehicle_id = $vehicle_ins->query()->max('id');
    
            $insert_counter = 1;
    
            $docs = [];
    
            for ($i = $min_vehicle_id ; $i <= $max_vehicle_id ; $i += $step) {
                $x = $i;
                $y = $i + $step;
    
                $vehicles = $vehicle_ins->query()
                    ->where('id', '>=', $x)
                    ->where('id', '<', $y)
                    ->get();
    
                foreach ($vehicles as $vehicle) {
    
                    $docs[] = new \Elastica\Document(
                        $vehicle->id,
                        [
                            // implementing my columns (91 columns)
                        ]);
    
                    echo ".";
    
                    if ($insert_counter % $step == 0) {
                        $es_type->addDocuments($docs);
                        $es_type->getIndex()->refresh();
                        $docs = [];
                        echo "\n";
                        echo $step . " rows inserted!";
                        echo "\n";
                    }
    
                    $insert_counter++;
    
                }
            }
            if (!empty($docs)) {
                $es_type->addDocuments($docs);
                $es_type->getIndex()->refresh();
                $docs = [];
            }
        }
    

    elastica 为了和你一起工作 弹性搜索 Laravel 5.7 具有 postgreSQL 作为主数据库。

    附言:这一方法也曾在 ElasticSearch website

    2 回复  |  直到 6 年前
        1
  •  1
  •   TheDevWay    6 年前

    问题是因为我内心的某些方法 Vehicle model 从数据库中获取属性后,在每个属性中执行了一些更改,这些不需要的更改使过程非常缓慢。

    解决方案是使用 Laravel DB facade 车型

    $min_vehicle_id = \Illuminate\Support\Facades\DB::table('vehicle')->min('id');
    $max_vehicle_id = \Illuminate\Support\Facades\DB::table('vehicle')->max('id');
    

    这是获取数据的方法:

    $vehicles = \Illuminate\Support\Facades\DB::table('vehicle')
                    ->where('id', '>=', $x)
                    ->where('id', '<', $y)
                    ->get();