2012-12-26 56 views
12

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

我该如何做到这一点?

在我的项目Solr的捆绑使用本:

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

在基地枝杈文件:

<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; 

} 

但在小枝文件这里我s渲染我不知道我会写什么。

+1

你在使用连接和Solr的搜索捆绑? –

+0

@ArtemL谢谢你的评论。我正在使用solr bundle和搜索没有,因为我是新搜索与solr。 – Sid

+0

你正在使用什么捆绑包?如何?一些鳕鱼可能有助于回答这个问题。 –

回答

0

尝试是这样的..

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> 
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或枝“为”以显示您的Solr文档

+0

我有日光浴场设置,我能够查询所示,但我努力尝试索引我的文件。我有一个Symfony2的注释对象,我有一个方法toSolrDocument(\ $ Solarium_Document_ReadWrite DOC)如图泽维尔·白里安的介绍到文档翻译。然而,当我调用它像这样的foreach($片为$片){$ 文件[] = $片状> toSolrDocument($最新情况:> createDocument()); }我得到'Solarium_Document_ReadWrite'找不到任何想法如何解决这个问题? –

+0

这很奇怪,你确定你的日光浴室的lib是在你的供应商库吗?确保你使用日光浴2.4.x,最新版本3.x使用PHP 5.3命名空间 –

+0

我解决了这个问题,通过删除readwrite类的要求。但是,我有一个新的问题有多个核心。我已经在solr示例安装中设置了多个内核,并将我需要的内核添加到我的symfony2配置中,但是,我可以访问的默认内核是在defaultCoreName属性下的sorl.xml文件中指定的内核。有任何想法吗? –

0

我还没有尝试过,但你可以尝试使用这种新Symfony2中的Jobeet tutorial,解释了如何构建系统以及如何使用Solr。
我希望这可以帮到你。

0

你得到通过

GET参数

$ searchName = $请求 - >查询 - >获取( 'SEARCH_NAME');

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

公共职能anagraficaAction(请求$要求)

这样,您就可以调用你的方法$ request参数。

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

$请求= $这 - >的get( '请求');

使用此您可以将您的setParameter改成这样:

的setParameter( '诺姆',$ searchName)