【问题标题】:Elastic Search bulk indexing using perl使用 perl 的弹性搜索批量索引
【发布时间】:2015-06-24 03:09:05
【问题描述】:

我已经尝试使用批量 API Perl 客户端在 Elasticsearch 中进行内容索引。我在批量摄取线上遇到错误。请在下面找到代码:

my $ifileid=0;
my $dir = '/home/bala/input_files/output';
opendir(DIR, $dir) or die $!;
my @arfiles = readdir (DIR);
closedir(DIR);
print scalar @arfiles." Total files\n";
foreach(@arfiles)
{
    my $file = $_;
    if ($ifileid>1)
    {
    $doc = {index => 'my_index', type => 'blog_post', id => $ifileid, body => {filename => $file, content => 'bala'}}; 
    push @docs, { create => $doc };
    if ($ibulkid==100)
        {       
            # bulk index docs
           my $res = $e->bulk(\@docs);      
           if ( $res->{errors} ) 
           {
            die "Bulk index had issues: " . $json->encode( $res->{errors} );
           }
           $ibulkid=0;      
        }
        $ibulkid++;
    }
    $ifileid++;
}

我收到以下错误:

Error => Not a HASH reference at /usr/local/share/perl5/Search/Elasticsearch/Role/Client/Direct.pm line 15.

【问题讨论】:

  • 从哪里获得$ibulkid 值?
  • 我以前用过。 ibulkid 用于将每 100 个文件索引到 ES 中。我的错误行是我的 $res = $e->bulk(\@docs);
  • 线索在错误中 - 这是一个数组引用,而不是哈希引用。

标签: perl elasticsearch bulkinsert


【解决方案1】:

上面bulk api的用法是错误的。 bulk 将 hashref 作为输入,其中 body 是对动作和文档数组的引用

例如,这些行中的某些内容应该可以工作:

$action = {index => {_index => 'my_index', _type => 'blog_post', _id => $ifileid}};
$doc =  {filename => $file, content => 'bala'};
push @docs, $action;
push @docs,$doc
if ($ibulkid==100)
    {       
        # bulk index docs
        my $res = $e->bulk(body => \@docs);      
       if ( $res->{errors} ) 
       {
        die "Bulk index had issues: " . $json->encode( $res->{errors} );
       }
       $ibulkid=0;      
    }
    $ibulkid++;
}
$ifileid++;

【讨论】:

  • 10 亿谢谢 keety。现在我能够获得 1250+ 文档/秒。这几乎是我的目标,即 1500。现在我使用的是单节点。如果我增加更多节点,索引计数是否会增加?
猜你喜欢
  • 2016-06-20
  • 2018-04-07
  • 2013-10-16
  • 1970-01-01
  • 2021-08-16
  • 2017-10-22
  • 2019-06-03
  • 1970-01-01
  • 2012-05-07
相关资源
最近更新 更多