2012-12-26 14 views
12

Ich möchte erstellen Suchfeld auf der Vorderseite meiner Website, aber ich weiß nicht, wie man mit Solr erstellen. Alle meine Website ist in Symfony2 entwickelt. Ich verwende die Datenbank nicht zum Suchen.Suchfeld in Symfony2 mit Solr

Wie kann ich das tun ?.

In meinem Projekt Solr Bündel Verwendung dieses:

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

In Basis Datei Zweig:

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

Einige Beispiel für mein Controller:

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; 

} 

Aber in Zweigdatei, wo dies i Ich weiß nicht, was ich schreiben werde.

+1

Welche Bündel verwenden Sie und in solr suchen zu verbinden? –

+0

@ArtemL Danke für den Kommentar .Ich verwende Solr-Bundle und zum Suchen nichts, da ich neu in der Suche mit solr bin. – Sid

+0

Welches Bündel verwendest du genau? Und wie? Etwas Kabeljau kann helfen, die Frage zu beantworten. –

Antwort

0

Versuchen Sie so etwas ..

Controlloer.php:

public function searchAction($templateName = '') 
{ 
    // ------ 
    // ------ 

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

    // Do some error checks 

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

} 

Zweig:

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

Sie https://github.com/nelmio/NelmioSolariumBundle mit Nutzung Solarium Implementierung

wirklich toll für besser nutzen können solr abfrage

ich es bereits verwenden

hier eine Probe

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

Verwendung foreach oder Zweig „in“ Ihr solr doc

+0

Ich habe ein Solarium eingerichtet und kann Anfragen stellen, aber ich bemühe mich, meine Dokumente zu indexieren. Ich habe ein annotiertes Objekt von Symfony2 und ich habe eine Methode toSolrDocument (\ Solarium_Document_ReadWrite $ doc), um das Dokument zu übersetzen, wie in Xavier Briands Präsentation gezeigt. Allerdings, wenn ich es so foreach ($ Blätter als $ Blatt) nennen { $ Dokumente [] = $ Blatt-> toSolrDocument ($ update-> createDocument()); } Ich bekomme 'Solarium_Document_ReadWrite' keine Idee gefunden, wie Sie dieses Problem lösen können? –

+0

Es ist komisch, Bist du sicher, dass deine Solarium-Bibliothek in deiner Verkäufer-Bibliothek ist? Stellen Sie sicher, dass Sie Solaris 2.4.x verwenden, die letzte Version 3.x verwendet PHP 5.3 Namespaces –

+0

Ich löste das Problem, indem Sie die Anforderung für die Readwrite-Klasse entfernen. Ich habe jedoch ein neues Problem mit mehreren Kernen. Ich habe mehrere Kerne in meiner Solr-Beispielinstallation eingerichtet und den Kern, den ich benötige, zu meiner symfony2-Konfiguration hinzugefügt, irgendwie ist der Standardkern, auf den ich zugreifen kann, der in der Datei sorl.xml unter der Eigenschaft defaultCoreName angegebene. Irgendwelche Ideen? –

0

ich noch versucht haben, nicht angezeigt werden, aber Sie können diese neue versuchen verwenden Jobeet tutorial in Symfony2, das erklärt, wie man ein System baut und wie man Solr darin benutzt.
Ich hoffe diese Hilfe.

0

Sie erhalten GET-Parameter über

$ search = $ request-> query-> get ('SEARCH_NAME');

Aber dafür brauchen Sie immer noch die Variable $ request. Sie können es als Parameter verwenden und Ihre Methodensignatur, um diese Änderung:

public function anagraficaAction (Request $ request)

Auf diese Weise können Sie die $ Anforderungsparameter in Ihre Methode aufrufen.

Die andere Möglichkeit besteht darin, die Anforderung des aktuellen Controllers innerhalb Ihrer Methode zu erhalten.

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

Mit diesem Sie Ihre setParameter auf diese ändern können:

setParameter ('nome', $ search)