2012-12-26 61 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)