Symfony and Zend Advanced Search Lucene
I use Symfony 1.4.11. I added search to my project, like in Jobeet tutorial. But I need to also make advanced search. For example, the user can іудусе "county" and "category". I make form and I read this tutorial. I also found this. But I do not now to separate query into several parts.
My class
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();
}
Table class
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';
}
In your lucene query you can tell which field to look in for the value, see the relevant part of the documentation.
It works like:
title:"The Right Way" AND text:go
精彩评论