viernes, 24 de agosto de 2007

Singleton para un indice de texto basado en Search Lucene en Symfony

Es relativamente fácil poder integrar herramientas del framework Zend dentro de Symfony. Con la creación del plugin sfZendPlugin se tienen las potencias de ambos frameworks para desarrollar aplicaciones. Unas de las carencias de Symfony que suple muy bien el Zend Framework es la posibilidad de manejar índices de texto, con su port de la herramienta Lucene.
El el blog de Spindrop hay un excelente ejemplo de como usar esta herramienta. Para facilitar aún más el uso de la misma, supongamos que tenemos un índice de texto para toda la aplicación, y queremos tener la posibilidad de instanciar el mismo desde cualquier parte de la misma. Para eso lo mejor es crear una clase singleton que podamos llamar y que nos retorne un objeto de tipo Zend_search_lucene. A continuación se muestra una clase que realiza este proceso. La misma incluso, en caso de que sea un índice nuevo, lo crea, y queda disponible para su posterior uso.


<?php

class sfIndex extends Zend_Search_Lucene
{
protected static $instance = null;

public static function getInstance()
{
if (!isset(self::$instance))
{
$class = __CLASS__;
$new = false;
$default_dir = sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'index';
$index_dir = sfConfig::get('app_index',$default_dir);
if (!is_dir($index_dir)) {
mkdir($index_dir);
$new = true;
}
self::$instance = new $class($index_dir,$new);
}

return self::$instance;
}

public function deleteDocByKeyword($keyword, $value)
{
$term = new Zend_Search_Lucene_Index_Term($value, $keyword);
$query = new Zend_Search_Lucene_Search_Query_Term($term);
$hits = array();
$hits = $this->find($query);

foreach ($hits AS $hit)
{
$this->delete($hit->id);
}
}


}
}

Esta clase se debe colocar en la carpeta lib de proyecto. Para poder usarla basta con definir el valor index en el archivo app.yml para indicar la carpeta donde se generará el índice, y posteriormente crear una instancia del objeto


$index = sfIndex::getInstance();

1 comentario:

Contacto dijo...

Muchas gracias, es justo lo que estaba buscando.