[英]How to integrate Elasticsearch in Zend Framework 2 using Doctrine 2
我遵循了本教程 ,将理论与Zend Framework 2集成在一起。现在,一切正常,但是我想将Elasticsearch集成到该项目中。
我找到了很多有关Elasticsearch的文档,我下载了PHP的Elastica插件,但是我不知道从哪里开始。
我搜索了将Elasticsearch与Doctrine集成的教程,但它们都是关于Symfony的。 有人可以(以一种简单的方式)向我解释一下如何在Zend Framework 2中使用ElasticSearch,将Doctrine 2作为ORM来索引和搜索我的对象吗?
在教义2和Elasticsearch之间不存在直接关系。 尽管Doctrine ORM的主要问题持续存在,更新和读取关系数据库上的数据,但是Elasticsearch主要致力于索引和搜索该数据。 与其考虑“将弹性搜索与理论整合在一起” , 不如考虑“如何在同一应用程序中同时使用理论和弹性搜索” 。
每当您在数据库中创建或更新记录时,您可能都想做更多的操作,例如在Elasticsearch或Solr上为该数据建立索引,在Memcached或Redis上缓存或使已缓存版本的相同数据无效。要正确执行此操作(或zf2方式),你应该仔细设计了一个服务层编排既持久性业务和相关后处理像elasticsearch,缓存,缓存无效,测井等索引..
通过EventManager触发一些事件来完成其中一些操作将是一个适当的决定。
注意:不要将EventManager大量用于简单明了的任务,例如编写日志行。 活动不是免费的,尤其是在ZF2中。 ( 在ZF3中有很大的改进,但仍然不是免费的 )。
有疑问的是,这是使用Zend Framework 2并同时使用ruflin / elastica的3rd party库的方法:
A.打开您的终端并输入
$ cd /path/to/your/project
$ php composer.phar selfupdate
$ php composer.phar require ruflin/elastica:dev-master
B.为Application\\Service\\ElasticaClientFactory.php
客户端Application\\Service\\ElasticaClientFactory.php
创建一个工厂
<?php
namespace Application\Service;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class ElasticaClientFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $sl)
{
$config = $sl->get('Config');
$clientOptions = isset($config['elastica']) ? $config['elastica'] : array();
$client = new \Elastica\Client($clientOptions);
return $client;
}
}
C.添加elastica配置并将新的工厂类注册到您的module.config.php
服务定位器中:
'elastica' => array(
'servers' => array(
array('host' => '127.0.0.1','port' => 9200),
// You can add more servers when necessary
// array('host' => '127.0.0.1','port' => 9200)
),
),
service_manager' => array(
'factories' => array(
'elastica-client' => 'Application\Service\ElasticaClientFactory'
),
)
此时,在任何控制器(坏)或服务(好)中,您都可以像下面这样抓取elastica客户实例:
$elastica = $this->getServiceLocator()->get('elastica-client');
如果您的PHP版本≥5.4,则可以使用特征,同时借助服务初始化程序将Elastica Client自动注入服务中 。
D.创建一个名为Application\\Service\\ElasticaAwareInterface.php
的新接口
<?php
namespace Application\Service;
interface ElasticaAwareInterface
{
public function getElasticaClient();
public function setElasticaClient(\Elastica\Client $client);
}
E.创建一个名为Application\\Traits\\ElasticaAwareTrait.php
的新特征(注意路径。如果不存在,则创建Traits文件夹)
<?php
namespace Application\Traits;
trait ElasticaAwareTrait
{
protected $client = null;
public function getElasticaClient()
{
return $this->client;
}
public function setElasticaClient(\Elastica\Client $client)
{
$this->client = $client;
return $this;
}
}
F.创建一个名为Application\\Initializers\\ElasticaInitializer.php
的新初始化Application\\Initializers\\ElasticaInitializer.php
(再次注意路径)
<?php
namespace Application\Initializers;
use Zend\ServiceManager\InitializerInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Application\Service\ElasticaAwareInterface;
class ElasticaInitializer implements InitializerInterface
{
/**
* Initializer for the elastica-aware domain services.
* Properly creates a new elastica client and injects it into related service.
*/
public function initialize($service, ServiceLocatorInterface $serviceManager)
{
/**
* Beware: This if statement will be run for every service instance
* we grab from $serviceManager because the nature of initializers.
* This worth think about on it. With ZF3 this went further.
* We may load our services lazily using delegator factories.
*/
if ($service instanceof ElasticaAwareInterface) {
$service->setElasticaClient( $serviceManager->get('elastica-client') );
}
}
}
到现在为止还挺好。 现在,我们可以将所有部分放在一起。 假设我们有一个名为UserService
的服务,该服务使用Doctrine实体管理器(或更好的UserRepository),还需要使用Elastica 。
G.向服务经理注册我们的服务:
service_manager' => array(
'factories' => array(
'elastica-client' => 'Application\Service\ElasticaClientFactory'
),
'invokables' => array(
'user-service' => 'Application\Service\UserService'
)
)
最后, UserService
签名:
<?php
namespace Application\Service;
use Application\Service\ElasticaAwareInterface;
class UserService implements ElasticaAwareInterface
{
// Here is our trait
use \Application\Traits\ElasticaAwareTrait;
public function fooMethod()
{
// Do some things with doctrine EM here..
// And grab the elastica client easily anywhere in UserService
$client = $this->getElasticaClient();
}
}
有一些(仍在开发中)模块结合了Doctrine2和ElasticSearch。 例如,从Doctrine2 + ZF2 Master @Ocramius本人中检查OcraElasticSearch
为OcraElasticSearch
模块 :)
否则,在集成Doctrine和ElasticSearch方面,Symfony2似乎领先一步。
我敢打赌,在一两个月之内,您应该可以在GitHub上找到更多替代方案。
由于我们很快需要类似的功能,因此我可能会在以后发现更多功能。 如果我愿意,我会更新我的帖子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.