A indexação adiciona/alterações que não estão funcionando usando o Lucene no Zend Framework
-
28-09-2019 - |
Pergunta
Sou muito novo na programação e definitivamente para a indexação Zend/Lucene. Pelo que posso dizer, meu código está correto. Sinto que posso estar ignorando uma etapa ou algo tentando fazer upload de alterações e adiciona ao banco de dados para que eles apareçam na pesquisa no meu site. Não estou recebendo nenhum tipo de mensagem de erro. Abaixo está o código do controlador. Acho que me avise se você precisar de mais alguma coisa para ajudar isso a fazer sentido. Agradecemos antecipadamente por qualquer direção que você possa dar.
class SearchController extends Zend_Controller_Action
{
public function init()
{
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity()) {
$this->view->identity = $auth->getIdentity();
}
}
public function indexAction()
{
// action body
}
public function buildAction()
{
// create the index
$index = Zend_Search_Lucene::open(APPLICATION_PATH . '/indexes');
$page = $this->_request->getParam('page');
// build product pages
if ($page == 'search') {
$mdl = new Model_Search();
$search = $mdl->fetchAll();
if ($search->count() > 0) {
foreach ($search as $s) {
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::unIndexed('id', $s->id));
$doc->addField(Zend_Search_Lucene_Field::text('name', $s->name));
$doc->addField(Zend_Search_Lucene_Field::text('uri', $s->uri));
$doc->addField(Zend_Search_Lucene_Field::text('description', $s->description));
$index->addDocument($doc);
}
}
$index->optimize();
$this->view->indexSize = $index->numDocs();
}
}
public function resultsAction()
{
if($this->_request->isPost()) {
$keywords = $this->_request->getParam('query');
$query = Zend_Search_Lucene_Search_QueryParser::parse($keywords);
$index = Zend_Search_Lucene::open(APPLICATION_PATH . '/indexes');
$hits = $index->find($query);
$this->view->results = $hits;
$this->view->keywords = $keywords;
} else {
$this->view->results = null;
}
}
}
Solução
Os índices Lucene não permanecerão sincronizados com o seu banco de dados automaticamente, você precisa reconstruir o índice inteiro ou remover e adquirir os documentos relevantes quando eles mudarem (você não pode editar um documento existente).
public function updateAction()
{
// something made the db change
$hits = $index->find("name: " . $name);
foreach($hits as $hit) {
$index->delete($hit->id)
}
$doc = new Zend_Search_Lucene_Document();
// build your doc
$index->add($doc);
}
Observe que os documentos do Lucene tinham sua própria propriedade de identificação interna e tenha cuidado para não confundi -lo com uma palavra -chave de identificação que você fornece.