2009-09-28 11 views
8

Estoy usando Zend_Search_Lucene para crear un índice de artículos que permitan su búsqueda en mi sitio web. Cada vez que un administrador actualizaciones/crea/elimina un artículo en el área de administración, el índice se reconstruye:Creando y actualizando los índices de Zend_Search_Lucene

$config = Zend_Registry::get("config"); 
$cache = $config->lucene->cache; 
$path = $cache . "/articles"; 

try 
{ 
    $index = Zend_Search_Lucene::open($path); 
} 
catch (Zend_Search_Lucene_Exception $e) 
{ 
    $index = Zend_Search_Lucene::create($path); 
} 

$model = new Default_Model_Articles(); 
$select = $model->select(); 
$articles = $model->fetchAll($select); 

foreach ($articles as $article) 
{ 
    $doc = new Zend_Search_Lucene_Document(); 
    $doc->addField(Zend_Search_Lucene_Field::Text("title", $article->title)); 
    $index->addDocument($doc); 
} 

$index->commit(); 

Mi pregunta es la siguiente. Ya que estoy reindexando los artículos y manejando los artículos eliminados también, ¿por qué no debería simplemente usar "crear" cada vez (en lugar de "abrir" y actualizar)? Usando el método anterior, creo que los artículos se agregarán con addDocument cada vez (por lo que habría duplicados). ¿Cómo evitaría eso? ¿Hay alguna manera de verificar si un documento ya existe en el índice?

Además, no creo que entienda completamente cómo funciona la indexación cuando la "abre" y la actualiza. Parece crear nuevos archivos # .cfs (así que tengo _0.cfs, _1.cfs, _2.cfs) en la carpeta de índice cada vez, pero cuando uso "create", sobrescribe ese archivo con un nuevo # .cfs archivo con el # incrementado (así, por ejemplo, solo _2.cfs). ¿Puedes explicarnos qué son estos archivos segmentados?

Respuesta

8

Sí, puede verificar si un documento ya está en el índice, eche un vistazo al this Manual Page. A continuación, puede eliminar este documento específico del índice a través de $ index-> ​​delete ($ id) ;, donde $ id es el valor de retorno del método termDocs. Después de eso, simplemente puede agregar la nueva versión del documento.

Acerca de los múltiples archivos de índice que crea Lucene: cada vez que modifica un índice existente, Lucene realmente no cambia los archivos existentes, sino que agrega índices parciales por cada cambio que realice. Esto es extremadamente malo para el rendimiento, pero hay una manera simple de evitar esto. Después de cada cambio que realice en el índice, haga lo siguiente: $ index-> ​​optimize(); - Esto agregará todos los archivos parciales al índice real, lo que mejorará considerablemente los tiempos de búsqueda.

+0

vendido! muchas gracias. – typeoneerror

Cuestiones relacionadas