[英]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.