簡體   English   中英

如何使用Doctrine 2將Elasticsearch集成到Zend Framework 2中

[英]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來索引和搜索我的對象嗎?

教義2Elasticsearch之間不存在直接關系。 盡管Doctrine ORM的主要問題持續存在,更新和讀取關系數據庫上的數據,但是Elasticsearch主要致力於索引和搜索該數據。 與其考慮“將彈性搜索與理論整合在一起”不如考慮“如何在同一應用程序中同時使用理論和彈性搜索”

每當您在數據庫中創建或更新記錄時,您可能都想做更多的操作,例如在ElasticsearchSolr上為該數據建立索引,在MemcachedRedis上緩存或使已緩存版本的相同數據無效。要正確執行此操作(或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本人中檢查OcraElasticSearchOcraElasticSearch模塊 :)

否則,在集成Doctrine和ElasticSearch方面,Symfony2似乎領先一步。

我敢打賭,在一兩個月之內,您應該可以在GitHub上找到更多替代方案。

由於我們很快需要類似的功能,因此我可能會在以后發現更多功能。 如果我願意,我會更新我的帖子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM