Symfony2 中的搜索框与 Solr

Posted

技术标签:

【中文标题】Symfony2 中的搜索框与 Solr【英文标题】:Search Box in Symfony2 with Solr 【发布时间】:2012-12-12 01:36:20 【问题描述】:

我想在我的网站首页创建搜索框,但我不知道如何使用Solr 创建一个。我所有的网站都是在 Symfony2 中开发的。我不使用数据库进行搜索。

我该怎么做?

在我的项目 Solr 中使用这个:

use SolrClient;
use SolrQuery;
use SolrObject;
use SolrDocument;
use SolrInputDocument;

在基础 twig 文件中:

<form action=" path("home_search") " method="get">
  <input type="search" name="search"><br>
  <input type="submit" value="search">
</form>

我的控制器的一些例子:

public function searchAction($templateName = '')

 $solrService = $this->get('rocket.solr_service');

    $solrQuery = new SolrQuery('*:*');
    $solrQuery->addField('id')
        ->addField('name');


    if (!empty($templateName)) 
        $solrQuery->addFilterQuery(sprintf('name:"%s" OR design_template_tag_name:"%1$s" OR design_category_name:"%1$s"',
                                           $templateName));
    


    $solrQuery->setRows(1000);

    $solrObject = $solrService->query(
        'RocketBraPrintBundle:DesignTemplate',
        $solrQuery,
        SolrService::WRITER_FORMAT_SOLR_OBJECT
    );

    $templates = $solrObject->offsetGet('response')->offsetGet('docs');
    if (!$templates) 

        if (!empty($templateName)) 
            $this->setFlash('catalog-message', 'No results found for your search.');
            return $this->searchDesignTemplates($categoryTreeSlug,
                                                $productFamilyFaceId);
        

        return array();
    

    return $templates;


但是在渲染的树枝文件中,我不知道我会写什么。

【问题讨论】:

您使用什么捆绑软件在 solr 中进行连接和搜索? @ArtemL 感谢您的评论。我正在使用 solr bundle 并且什么都不搜索,因为我是 solr 搜索的新手。 您使用的是什么包?如何?一些鳕鱼可能有助于回答这个问题。 @ArtemL 我已经编辑了我的问题,你可以看到 deps 文件,我没有任何搜索代码。 看不到任何 solr 包。你能指出你已经在使用 solr 的哪个包吗? 【参考方案1】:

您可以将https://github.com/nelmio/NelmiosolariumBundle 与使用日光浴室一起使用

非常适合更好的 solr 查询

我已经用过了

这里是一个示例

    $query = 'foo';

    $page = 1;
    if (array_key_exists('page', $params)) 
        $page = (int) $params['page'];
    
    $rows = 10;
    if (array_key_exists('limit', $params)) 
        $rows = (int) $params['limit'];
    

    $solarium = $this->get('solarium.client');

    //select
    $select = $solarium->createSelect();
    $escapedQuery = $select->getHelper()->escapePhrase($query);

    //dismax
    $dismax = $select->getDisMax();
    // override the default setting of 'dismax' to enable 'edismax'
    $dismax->setQueryParser('edismax');
    //fields
    $dismax->setQueryFields(
                    array('title^5','description^0.7'));

    $select->setQuery($escapedQuery);

    //limit
    $select->setRows($rows);
    $select->setStart(($page - 1) * $rows);

    //type spot only
    $select->createFilterQuery('typeFilter')
            ->setQuery(sprintf('type:%s', 'spot'));

    $resultset = $solarium->select($select);

使用 foreach 或 twig "for in" 来显示你的 solr doc

【讨论】:

我已经设置了日光浴室,并且可以进行如图所示的查询,但是我正在努力尝试为我的文档编制索引。我有一个 Symfony2 注释对象,我有一个方法 toSolrDocument(\Solarium_Document_ReadWrite $doc) 来翻译文档,如 Xavier Briand 的演示文稿中所示。但是,当我这样称呼它时 foreach ($sheets as $sheet) $documents[] = $sheet->toSolrDocument($update->createDocument()); 我得到“Solarium_Document_ReadWrite”没有找到任何想法如何解决这个问题? 很奇怪,你确定你的日光浴室库在你的供应商库中吗?确保您使用的是 solarium 2.4.x,最新版本 3.x 使用 php 5.3 命名空间 我通过删除对读写类的要求解决了这个问题。但是,我有一个具有多个核心的新问题。我在我的 solr 示例安装中设置了多个核心,并将我需要的核心添加到我的 symfony2 配置中,但是,不知何故,我可以访问的默认核心是 sorl.xml 文件中 defaultCoreName 属性下指定的核心。有什么想法吗? 请打开一个新问题,它与搜索框问题无关。谢谢【参考方案2】:

试试这样的..

Controlloer.php:

public function searchAction($templateName = '')

    // ------
    // ------

    $resultset = $solrObject->offsetGet('response');

    // Do some error checks

    return array('resultset'=>$resultset);


树枝:

<ul>
% for doc in resultset %
  <li>  doc.name  </li>
% endfor %
</ul>

【讨论】:

【参考方案3】:

我还没有尝试过,但是您可以尝试在 Symfony2 中使用这个新的Jobeet tutorial,它解释了如何构建系统以及如何在其中使用 Solr。 我希望这会有所帮助。

【讨论】:

【参考方案4】:

您可以通过

获得 GET 参数

$searchName = $request->query->get('search_name');

但是为此,您仍然需要 $request 变量。您可以将其用作参数并将您的方法签名更改为:

公共函数 anagraficaAction(Request $request)

这样,您可以在方法中调用 $request 参数。

另一种方法是在你的方法中获取当前控制器的请求。

$request = $this->get('request');

使用这个你可以把你的 setParameter 改成这个:

setParameter('nome', $searchName)

【讨论】:

以上是关于Symfony2 中的搜索框与 Solr的主要内容,如果未能解决你的问题,请参考以下文章

搜索引擎solr简介

select2 下拉框与 jQuery 日期选择器不兼容?

Hue, Solr - 搜索词的自动填充

Flex - 通过文本输入搜索/过滤 DataGrid

利用Solr服务建立的站内搜索雏形

Symfony2 - 使用没有附加任何实体的表单生成器