Symfony und Zend Advanced Search Lucene
-
27-10-2019 - |
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';
}
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