Frage

Ich benutze Symfony 1.4.11. Ich habe mein Projekt gesucht, wie in Tutorial für das Onoualeet. Aber ich muss auch fortgeschrittene Suche durchführen. Zum Beispiel kann der Benutzer "County" und "Kategorie". Ich mache Form und lese ich Dies Lernprogramm. Ich habe auch gefunden Dies. Aber jetzt, um die Frage in mehrere Teile zu trennen.

Meine Klasse

public function updateLuceneIndex()
{
  $index = $this->getTable()->getLuceneIndex();

    // remove an existing entry
    if ($hit = $index->find('pk:'.$this->getAdId()))
    {
      $index->delete($hit->Adid);
    }

    // don't index expired and non-activated 
    if (!$this->getActive())
    {
      return;
    }

    $doc = new Zend_Search_Lucene_Document();

    // store  primary key URL to identify it in the search results
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('pk', $this->getAdId()));



  $doc->addField(Zend_Search_Lucene_Field::UnStored('address', $this->getAddress(), 'utf-8'));
  $doc->addField(Zend_Search_Lucene_Field::UnStored('company', $this->getCompany(), 'utf-8'));
  $doc->addField(Zend_Search_Lucene_Field::UnStored('country', $this->getCountry(), 'utf-8'));
  $doc->addField(Zend_Search_Lucene_Field::UnStored('contact_person', $this->getContactPerson(), 'utf-8'));
  $doc->addField(Zend_Search_Lucene_Field::UnStored('phone', $this->getPhone(), 'utf-8'));
  $doc->addField(Zend_Search_Lucene_Field::UnStored('email', $this->getEmail(), 'utf-8'));
  $doc->addField(Zend_Search_Lucene_Field::UnStored('title', $this->getTitle(), 'utf-8'));
  $doc->addField(Zend_Search_Lucene_Field::UnStored('content', $this->getContent(), 'utf-8'));
  $doc->addField(Zend_Search_Lucene_Field::UnStored('category_id', $this->getCategoryId(), 'utf-8'));


  $index->addDocument($doc);
  $index->commit();

  }

Tischklasse

public function getAdsLuceneQuery($query)
{
 ProjectConfiguration::registerZend();
 $query = Zend_Search_Lucene_Search_QueryParser::parse($query);

    $hits = self::getLuceneIndex()->find($query);

  $pks = array();
  foreach ($hits as $hit)
  {
    $pks[] = $hit->pk;
  }

  if (empty($pks))
  {
    return array();
  }

  $q = $this->createQuery('a')
    ->whereIn('a.AdId', $pks)
    ->limit(20);

  $q = $this->createQuery('a')
           ->andWhere('a.active = ?',1)
             ->leftJoin('a.Owner o')
           ->leftJoin('o.Profile p')
           ->andWhere('p.payed_until > NOW()')
           ->andWhere('a.expires_at > NOW()')

     ->addORDERBY ('created_at DESC');

  return $q->execute();

}
 public function getLuceneIndex()
  {
    ProjectConfiguration::registerZend();

    if (file_exists($index = $this->getLuceneIndexFile()))
    {
      return Zend_Search_Lucene::open($index);
    }
    else
    {
      return Zend_Search_Lucene::create($index);
    }
  }

static public function getLuceneIndexFile()
{
  return sfConfig::get('sf_data_dir').'/ads.'.sfConfig::get('sf_environment').'.index';
}
War es hilfreich?

Lösung

In Ihrer Lucene -Abfrage können Sie feststellen, welches Feld nach dem Wert suchen soll, siehe Der relevante Teil der Dokumentation.

Es funktioniert wie:

title:"The Right Way" AND text:go
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top