存储弹性搜索连接的mojolicious助手

时间:2015-05-07 10:13:06

标签: perl elasticsearch mojolicious

我在mojolicious中尝试弹性搜索。

我两个都很新。

我想创建一个帮助来存储ES连接,我希望传递与ES相关的帮助程序配置(例如节点信息,trace_on文件等)。

如果我编写以下非常简单的帮助器,它可以工作;

has elasticsearch => sub {
    return Search::Elasticsearch->new( nodes => '192.168.56.21:9200', trace_to => ['File','/tmp/elasticsearch.log'] );
};

然后在启动

$self->helper(es => sub { $self->app->elasticsearch() });

但是,如果我尝试扩展它以采取配置 - 如下所示 - 它失败。当应用程序调用$ self-> es-> index

时,我收到错误“无法在包上找到索引”
has elasticsearch => sub {
    my $config = shift;
    my $params->{nodes} = '192.168.56.21:' . $config->{port};
    $params->{trace_to} = $config->{trace_to} if $config->{trace_to};
    my $es = Search::Elasticsearch->new( $params );
    return $es;
};

并在启动时

$self->helper(es => sub { $self->app->elasticsearch($self->config->{es}) });

我认为我只是误解了帮助者或配置或两者兼而有之 - 有人可以启发我吗?

只是fyi,在一个单独的控制器文件中,我使用了如下助手;

$self->es->index(
    index   => $self->_create_index_name($index),
    type    => 'crawl_data',
    id      => $esid,
    body    => {
        content => encode_json $data,
    }
);

如果我使用上面的简单(第1个)表单创建帮助程序,它可以正常工作。 我希望这是足够的信息?如果需要其他任何东西,请告诉我?

1 个答案:

答案 0 :(得分:1)

首先,hashelper不一样。 has是一个延迟构建的实例属性。属性构造函数的唯一参数是实例。对于应用程序,它看起来像:

package MyApp;

has elasticsearch => sub {
  my $app = shift;
  Search::ElasticSearch->new($app->config->{es});
};

sub startup {
  my $app = shift;
  ...
}

此实例在首次使用后的应用程序生命周期内是持久的。我不确定S :: ES是否有任何重新连接丢弃逻辑,所以你可能需要考虑一个永久对象是你想要的。

相比之下,帮助程序只是一种方法,可供应用程序,所有控制器和所有模板使用(在后一种情况下,作为一个函数)。助手的第一个参数是控制器实例,无论是当前的还是新的,取决于上下文。因此,您需要构建您的帮助程序,如:

has (elasticsearch => sub {
  my ($c, $config) = @_;
  $config ||= $c->app->config->{es};
  Search::ElasticSearch->new($config);
});

此机制将按需构建实例,并且可以接受传入参数,可能用于可选配置覆盖,如我在该示例中所示。

我希望这能回答你的问题。