创建自定义存储库fos弹性搜索

时间:2014-11-07 18:02:59

标签: symfony elastica foselasticabundle

我试图创建一个简单的自定义存储库,以了解弹性搜索存储库的工作原理。文档很简单,但我仍然不明白它是如何工作的,我得到这个错误'服务定义'fos_elastica.manager“不存在。”。到目前为止,我认为我的问题是在控制器,因为我不明白如何初始化它们,我也想知道我是否以正确的方式在我的自定义存储库配置和我做的简单查询。

每当我尝试进行搜索时,我都会通过此配置获得此错误,

 The service definition "fos_elastica.manager" does not exist.

到目前为止这是我的配置:     //app/config.yml

fos_elastica:
    clients:
        default: { host: localhost, port: 9200 }
    indexes:
         sava:
            client: default
            types:
                blog:
                    mappings:
                        id:
                            type: integer
                        body : ~
                        title : ~
                        tags: ~
                    persistence:
                        identifier: id
                        driver: orm
                        model: sava\BlogBundle\Entity\TblPost
                        finder: ~
                        provider: ~
                        listener: ~
                        repository: sava\BlogBundle\SearchRepository\TblPostRepository

这是我的控制器动作:

namespace sava\BlogBundle\Controller;

//custom querys
use FOS\ElasticaBundle\Manager\RepositoryManager;
use FOS\ElasticaBundle\Repository;
//
use Symfony\Component\DependencyInjection\ContainerBuilder;

class TblPostController extends Controller
{
        public function getPostAction(Request $request)
    {   
         $container = new ContainerBuilder();
         $repositoryManager = $container->get('fos_elastica.manager');

         $repository = $repositoryManager->getRepository('BlogBundle:TblPost');

        $items2 = $repository->matchExact($categoria,$searchQuery );


         return $this->render('savaBlogBundle:TblPost:index.html.twig', array(
                    'results' => $items2, 'entities' => $items2
        ));
    }

这是我的帖子库:

<?php

namespace sava\BlogBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

use FOS\ElasticaBundle\Repository;

class TblPostRepository extends FOS\ElasticaBundle\Repository
{
    public function matchExact($campo, $searchQuery) {


         //$finder = $this->get('fos_elastica.finder.sava.blog');

        $query = new Query();
        if($searchQuery=='')
        {
            $innerQuery = new Query\MatchAll();
        }
        else{
           $innerQuery = new Query\Match();
        $innerQuery->setField( $campo  , array('query' => $searchQuery));
        }
        $query->setQuery($innerQuery);
        $query->setSize(1000000);
        $query->setExplain(true);

        return $this->find($query);
    }  
}

因为即时通讯使用yml这是我的tblpost.orm,我确实生成了我的实体。

无论什么时候我去做postaction,它都会让我发现它无法找到容器,而且我没有看到如何正确地使用它的例子,这也就是你如何进行自定义查询?

编辑1:

所以我改变了这个:

    $container = new ContainerBuilder();
    $repositoryManager = $container->get('fos_elastica.manager');

到此:

    $elastica = $this->container->get('fos_elastica.manager');// single entry point, no fancy services    
    $SearchRepository = $elastica->getRepository('savaBlogBundle:TblPostRepository');// single type

我发现了这个错误:

 No search finder configured for sava\BlogBundle\Entity\TblPostRepository

2 个答案:

答案 0 :(得分:3)

&只是遇到了同样的问题,解决方案是,您应该使用您的实体,而不是savaBlogBundle:TblPostRepository,例如:

$SearchRepository = $elastica->getRepository('savaBlogBundle:TblPost`)

答案 1 :(得分:0)

根据您在问题标题中的致命错误enter link description here

为什么你得到这个错误的主要问题是,你在(doctrine config for entity)和fos_elastica中分配了相同的TblPostRepository。

相关问题