Php 在symfony 2中搜索函数的最佳方法

Php 在symfony 2中搜索函数的最佳方法,php,symfony,search-engine,Php,Symfony,Search Engine,我在我的网站上有一个搜索功能,用elasticsearch实现。 现在我有一个关于设计的小问题 我有一个带有route/search的searchAction,它在查询字符串中接受一个参数。比如/search?术语=… 我想让结果列表可过滤,但我对实现这一点的正确设计有一些疑问 制作过滤结果列表的最佳解决方案是什么 如果我传递filter参数,我需要用当前url指定一个表单操作,并像链接一样附加当前查询字符串,对吗? 例如: 在本例中,url类似于:/search?terms=…&此过滤器=…

我在我的网站上有一个搜索功能,用elasticsearch实现。 现在我有一个关于设计的小问题

我有一个带有route
/search
searchAction
,它在查询字符串中接受一个参数。比如
/search?术语=…

我想让结果列表可过滤,但我对实现这一点的正确设计有一些疑问

制作过滤结果列表的最佳解决方案是什么

如果我传递filter参数,我需要用当前url指定一个表单操作,并像链接一样附加当前查询字符串,对吗? 例如:

在本例中,url类似于:
/search?terms=…&此过滤器=…

在带有get参数和post过滤器的表单案例中,我需要在搜索操作中同时使用这两种类型的参数。这个好吗

相反,链接现在将在
$get
请求中包含所有参数,但我不喜欢在模板中使用查询字符串构建url


最好的方法是什么?

我更喜欢查询字符串中的所有参数,这将允许用户将url添加到书签或通过电子邮件发送。

这取决于具体情况

1如果你不需要索引(例如SEO-GoogleBot)过滤结果页面,我认为你应该使用AJAX来实现这一点

路由:

search_result:
    pattern: /search
    defaults:  { _controller: AcmeExampleBundle:Ajax:searchResult }
    requirements:
        _method:  POST
search_result:
    pattern: /search/{queryString}/{make}/{model}
    defaults:  { _controller: AcmeExampleBundle:Ajax:searchResult }
    requirements:
        _method:  GET
JavaScript(伪代码)

当然,您不应该对url“/search”进行编码

控制器:

// src/Acme/ExampleBundle/Controller/AjaxController.php
    // ...
    public function searchResultAction()
    {
        $filters = $this->getRequest()->get('filters', array());
        $searchObject = new searchObj(); 
        // or smt like $this->get('service_name'); if you use search object as service
        // you can also use entity manager
        $searchObject->setQueryString($this->getRequest()->get('queryString'));
        $searchObject->setFilters($filters);
        return $this->render('AcmeExampleBundle:Ajax:searchResult.html.twig', array(
            'records' => $searchObject->getResults()
        ));
    }
// src/Acme/ExampleBundle/Controller/AjaxController.php
    // ...
    public function searchResultAction($queryString, $make, $model)
    {
        $filters = array('make' => $make, 'model' => $model);
        $searchObject = new searchObj(); 
        // or smt like $this->get('service_name'); if you use search object as service
        // you can also use entity manager
        $searchObject->setQueryString($queryString);
        $searchObject->setFilters($filters);
        return $this->render('AcmeExampleBundle:Ajax:searchResult.html.twig', array(
            'records' => $searchObject->getResults()
        ));
    }
当然,您可以返回json响应,但在我看来,返回准备注入模板的一部分是最容易管理的

和视图:

{% for record in records %}
    <div class="record">{{ record.title }}</div>
{% endfor %}
控制器:

// src/Acme/ExampleBundle/Controller/AjaxController.php
    // ...
    public function searchResultAction()
    {
        $filters = $this->getRequest()->get('filters', array());
        $searchObject = new searchObj(); 
        // or smt like $this->get('service_name'); if you use search object as service
        // you can also use entity manager
        $searchObject->setQueryString($this->getRequest()->get('queryString'));
        $searchObject->setFilters($filters);
        return $this->render('AcmeExampleBundle:Ajax:searchResult.html.twig', array(
            'records' => $searchObject->getResults()
        ));
    }
// src/Acme/ExampleBundle/Controller/AjaxController.php
    // ...
    public function searchResultAction($queryString, $make, $model)
    {
        $filters = array('make' => $make, 'model' => $model);
        $searchObject = new searchObj(); 
        // or smt like $this->get('service_name'); if you use search object as service
        // you can also use entity manager
        $searchObject->setQueryString($queryString);
        $searchObject->setFilters($filters);
        return $this->render('AcmeExampleBundle:Ajax:searchResult.html.twig', array(
            'records' => $searchObject->getResults()
        ));
    }
将KNP paginator bundle与搜索操作一起使用。在搜索表单上,将post操作发送到控制器中的searchAction,并在使用匹配条件对数据进行排序后,重新呈现页面

// src/Acme/ExampleBundle/Controller/AjaxController.php
    // ...
    public function searchResultAction($queryString, $make, $model)
    {
        $filters = array('make' => $make, 'model' => $model);
        $searchObject = new searchObj(); 
        // or smt like $this->get('service_name'); if you use search object as service
        // you can also use entity manager
        $searchObject->setQueryString($queryString);
        $searchObject->setFilters($filters);
        return $this->render('AcmeExampleBundle:Ajax:searchResult.html.twig', array(
            'records' => $searchObject->getResults()
        ));
    }
public function searchAction(Request $request,array $arguments = array())
        {
            $em = $this->getDoctrine()->getManager();
            $paginator = $this->get('knp_paginator');
            $parameter = $request->get('board_search');
            $boardRepo = $this->getDoctrine()->getRepository('PNCMISDashboardBundle:ExaminationBoards')->loadBoardByName($parameter);
            $boards = $paginator->paginate($boardRepo, $this->get('request')->query->get('page', 1), 10);
            return $this->render('PNCMISDashboardBundle:ExaminationBoards/CRUD:index.html.twig', array(
                    'boards'=> $boards,
                )
            );
        }


public function loadBoardByName($name)
    {
        $q = $this
            ->createQueryBuilder('boards')
            ->where('upper(boards.name) LIKE upper(:search)')
            ->setParameter('search', '%'.$name.'%')
            ->getQuery()
        ;
        try {
            // The Query::getSingleResult() method throws an exception
            // if there is no record matching the criteria.
            $user = $q->getResult();
        } catch (NoResultException $e) {
            throw new UsernameNotFoundException(sprintf('Unable to find an board identified by "%s".', $name), null, 0, $e);
        }
        return $user;
    }