TigerZF
🌐Español

61.9. Avanzado

61.9.1. A partir de la versión 1.6, manejo de las transformaciones del formato de índice

El componente Zend_Search_Lucene funciona con los formatos de índice de Java Lucene 1.4-1.9, 2.1 y 2.3.

El formato de índice actual puede solicitarse mediante la llamada $index->getFormatVersion(). Devuelve uno de los siguientes valores:

  • Zend_Search_Lucene::FORMAT_PRE_2_1 para el formato de índice de Java Lucene 1.4-1.9.

  • Zend_Search_Lucene::FORMAT_2_1 para el formato de índice de Java Lucene 2.1 (también se usa para Lucene 2.2).

  • Zend_Search_Lucene::FORMAT_2_3 para el formato de índice de Java Lucene 2.3.

Las modificaciones del índice se realizan únicamente si se realiza alguna actualización del índice. Eso ocurre si se añade un nuevo documento a un índice o si se inicia manualmente la optimización del índice mediante la llamada $index->optimize().

En tal caso, Zend_Search_Lucene puede convertir el índice a la versión de formato superior. Eso siempre ocurre con los índices en formato Zend_Search_Lucene::FORMAT_PRE_2_1, que se convierten automáticamente al formato 2.1.

Puede gestionar el proceso de conversión y asignar el formato de índice objetivo mediante $index->setFormatVersion(), que toma la constante Zend_Search_Lucene::FORMAT_2_1 o Zend_Search_Lucene::FORMAT_2_3 como parámetro:

  • Zend_Search_Lucene::FORMAT_2_1 en realidad no hace nada ya que los índices anteriores a 2.1 se convierten automáticamente al formato 2.1.

  • Zend_Search_Lucene::FORMAT_2_3 fuerza la conversión al formato 2.3.

Las conversiones hacia atrás no están soportadas.

[Note] ¡Importante!

Una vez que el índice se convierte a una versión superior, no se puede volver a convertir. Así que haga una copia de seguridad de su índice cuando planee migrar a una versión superior, pero desee tener la posibilidad de volver atrás.

61.9.2. Uso del índice como propiedad estática

El objeto Zend_Search_Lucene utiliza el método destructor para confirmar los cambios y liberar recursos.

Almacena los documentos añadidos en memoria y vuelca el nuevo segmento de índice en disco dependiendo del parámetro MaxBufferedDocs.

Si no se alcanza el límite de MaxBufferedDocs, entonces hay algunos documentos "no guardados" que se guardan como un nuevo segmento en el método destructor del objeto. El procedimiento de auto-optimización del índice se invoca si es necesario dependiendo de los valores de los parámetros MaxBufferedDocs, MaxMergeDocs y MergeFactor.

Las propiedades estáticas de los objetos (véase más abajo) se destruyen después de la última línea del script ejecutado.

class Searcher {
    private static $_index;

    public static function initIndex() {
        self::$_index = Zend_Search_Lucene::open('path/to/index');
    }
}

Searcher::initIndex();

Aun así, el destructor de las propiedades estáticas se invoca correctamente en este punto de la ejecución del programa.

Un problema potencial es el manejo de excepciones. Las excepciones lanzadas por los destructores de objetos estáticos no tienen contexto, porque el destructor se ejecuta después de que el script ya haya finalizado.

Puede ver un mensaje de error del tipo "Fatal error: Exception thrown without a stack frame in Unknown on line 0" en lugar de la descripción de la excepción en tales casos.

Zend_Search_Lucene proporciona una solución alternativa a este problema con el método commit(). Guarda todos los cambios no guardados y libera la memoria usada para almacenar los nuevos segmentos. Es libre de usar la operación commit en cualquier momento, o incluso varias veces, durante la ejecución del script. Todavía puede usar el objeto Zend_Search_Lucene para buscar, añadir o eliminar documentos después de la operación commit. Pero la llamada a commit() garantiza que si no se añade ni elimina ningún documento después de la llamada a commit(), entonces el destructor de Zend_Search_Lucene no tendrá nada que hacer y no lanzará ninguna excepción:

class Searcher {
    private static $_index;

    public static function initIndex() {
        self::$_index = Zend_Search_Lucene::open('path/to/index');
    }

    ...

    public static function commit() {
        self::$_index->commit();
    }
}

Searcher::initIndex();

...

// Script shutdown routine
...
Searcher::commit();
...