【问题标题】:mojolicious helper storing an elasticsearch connection存储弹性搜索连接的 mojolicious 助手
【发布时间】:2015-05-07 10:13:05
【问题描述】:

我正在 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}) });

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

仅供参考,在一个单独的控制器文件中,我使用如下帮助器;

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

如果我使用上面的简单(第一种)形式创建助手,那效果很好。 我希望这是足够的信息?如果还需要什么,请告诉我?

【问题讨论】:

    标签: perl elasticsearch mojolicious


    【解决方案1】:

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

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

    在首次使用后,此实例将在应用程序的整个生命周期内保持不变。我不确定 S::ES 是否有任何 reconnect-on-drop 逻辑,因此您可能需要考虑一下永久对象是否真的是您想要的。

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

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

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

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

    【讨论】:

    • 嗨乔尔 - 非常感谢。在这种情况下,是否有一种可接受的方式来支持重新连接?你能想出我可以看的任何模块吗?
    • 您必须在弹性搜索社区中提问。我知道 metacpan 使用弹性搜索,所以他们可能会为您提供一些答案。
    猜你喜欢
    • 2021-05-23
    • 2018-11-28
    • 1970-01-01
    • 2023-03-19
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多