Para aprovechar al máximo las capacidades de Zend_Search_Lucene con
el mejor rendimiento, es necesario comprender su estructura interna de índice.
Un índice se almacena como un conjunto de archivos dentro de un único directorio.
Un índice consiste en cualquier número de
segmentos independientes que almacenan información sobre un subconjunto de documentos indexados.
Cada segmento tiene su propio diccionario de términos, índice del diccionario
de términos, y almacenamiento de documentos (valores de campos almacenados) [3]. Todos los datos del segmento se almacenan en
archivos _xxxxx.cfs, donde xxxxx es el nombre de un segmento.
Una vez creado un archivo de segmento de índice, no se puede actualizar. Los nuevos documentos se añaden a nuevos
segmentos. Los documentos eliminados solo se marcan como eliminados en un archivo opcional
<segmentname>.del.
La actualización de documentos se realiza como operaciones independientes de eliminación y adición, aunque se haga
mediante una llamada API update()
[4].
Esto simplifica la adición de nuevos documentos, y permite actualizar simultáneamente con las operaciones
de búsqueda.
Por otro lado, el uso de varios segmentos (un documento por segmento como caso límite) aumenta el tiempo de búsqueda:
la recuperación de un término de un diccionario se realiza para cada segmento;
el índice del diccionario de términos se precarga para cada segmento (este proceso ocupa la mayor parte del tiempo de búsqueda en consultas simples, y también requiere memoria adicional).
Si el diccionario de términos alcanza un punto de saturación, entonces la búsqueda a través de un segmento es N veces más rápida que la búsqueda a través de N segmentos en la mayoría de los casos.
La optimización del índice combina dos o más segmentos en un único segmento nuevo. Un nuevo segmento se añade a la lista de segmentos del índice, y los segmentos antiguos se excluyen.
Las actualizaciones de la lista de segmentos se realizan como una operación atómica. Esto proporciona la capacidad de añadir nuevos documentos, realizar la optimización del índice y buscar en el índice de forma simultánea.
La optimización automática del índice se realiza después de cada nueva generación de segmentos. Combina los conjuntos de los segmentos más pequeños en segmentos más grandes, y los segmentos más grandes en segmentos aún más grandes, si hay suficientes segmentos para combinar.
La optimización automática del índice se controla mediante tres opciones:
MaxBufferedDocs (el número mínimo de documentos necesario antes de que los documentos almacenados en memoria intermedia se escriban en un nuevo segmento);
MaxMergeDocs (el mayor número de documentos que se combinan nunca en una operación de optimización); y
MergeFactor (que determina con qué frecuencia se combinan los índices de segmentos mediante operaciones de optimización automática).
Si añadimos un documento por ejecución de script, entonces MaxBufferedDocs realmente no se utiliza (solo se crea un nuevo segmento con un único documento al final de la ejecución del script, momento en el que se inicia el proceso de optimización automática).
[3] A partir de
Lucene 2.3, los archivos de almacenamiento de documentos pueden compartirse entre segmentos; sin embargo,
Zend_Search_Lucene no utiliza esta
capacidad
[4] Esta llamada actualmente solo la proporciona Java Lucene, pero está previsto extender
la API de Zend_Search_Lucene con una funcionalidad
similar