TigerZF
🌐Español

Capítulo 61. Zend_Search_Lucene

Tabla de contenidos

61.1. Resumen
61.1.1. Introducción
61.1.2. Objetos Document y Field
61.1.3. Entendiendo los tipos de campo
61.1.4. Documentos HTML
61.1.5. Documentos Word 2007
61.1.6. Documentos Powerpoint 2007
61.1.7. Documentos Excel 2007
61.2. Construcción de índices
61.2.1. Creación de un índice nuevo
61.2.2. Actualización del índice
61.2.3. Actualización de documentos
61.2.4. Obtención del tamaño del índice
61.2.5. Optimización del índice
61.2.5.1. Opción de auto-optimización MaxBufferedDocs
61.2.5.2. Opción de auto-optimización MaxMergeDocs
61.2.5.3. Opción de auto-optimización MergeFactor
61.2.6. Permisos
61.2.7. Limitaciones
61.2.7.1. Tamaño del índice
61.2.7.2. Sistemas de archivos soportados
61.3. Búsqueda en un índice
61.3.1. Construcción de consultas
61.3.1.1. Análisis de consultas
61.3.2. Resultados de búsqueda
61.3.3. Limitación del conjunto de resultados
61.3.4. Puntuación de resultados
61.3.5. Ordenación de resultados de búsqueda
61.3.6. Resaltado de resultados de búsqueda
61.4. Lenguaje de consulta
61.4.1. Términos
61.4.2. Campos
61.4.3. Comodines
61.4.4. Modificadores de términos
61.4.5. Búsquedas por rango
61.4.6. Búsquedas difusas
61.4.7. Limitación de términos coincidentes
61.4.8. Búsquedas de proximidad
61.4.9. Potenciar un término
61.4.10. Operadores booleanos
61.4.10.1. AND
61.4.10.2. OR
61.4.10.3. NOT
61.4.10.4. operadores &&, || y !
61.4.10.5. +
61.4.10.6. -
61.4.10.7. Sin operador
61.4.11. Agrupación
61.4.12. Agrupación de campos
61.4.13. Escapado de caracteres especiales
61.5. API de construcción de consultas
61.5.1. Excepciones del analizador de consultas
61.5.2. Consulta de término
61.5.3. Consulta multi-término
61.5.4. Consulta booleana
61.5.5. Consulta con comodín
61.5.6. Consulta difusa
61.5.7. Consulta de frase
61.5.8. Consulta de rango
61.6. Juego de caracteres
61.6.1. Soporte de UTF-8 y de juegos de caracteres de un solo byte
61.6.2. Analizador de texto por defecto
61.6.3. Analizadores de texto compatibles con UTF-8
61.7. Extensibilidad
61.7.1. Análisis de texto
61.7.2. Filtrado de tokens
61.7.3. Algoritmos de puntuación
61.7.4. Contenedores de almacenamiento
61.8. Interoperación con Java Lucene
61.8.1. Formatos de archivo
61.8.2. Directorio del índice
61.8.3. Código fuente Java
61.9. Avanzado
61.9.1. A partir de la versión 1.6, gestión de las transformaciones del formato de índice
61.9.2. Uso del índice como propiedad estática
61.10. Buenas prácticas
61.10.1. Nombres de campos
61.10.2. Rendimiento de indexación
61.10.3. Indexación durante el apagado
61.10.4. Recuperación de documentos por identificador único
61.10.5. Uso de memoria
61.10.6. Codificación
61.10.7. Mantenimiento del índice

61.1. Resumen

61.1.1. Introducción

Zend_Search_Lucene es un motor de búsqueda de texto de propósito general escrito enteramente en PHP 5. Dado que almacena su índice en el sistema de archivos y no requiere un servidor de base de datos, puede añadir capacidades de búsqueda a casi cualquier sitio web basado en PHP. Zend_Search_Lucene soporta las siguientes características:

  • Búsqueda por relevancia: los mejores resultados se devuelven primero

  • Muchos tipos de consulta potentes: consultas de frase, consultas booleanas, consultas con comodín, consultas de proximidad, consultas por rango y muchas otras.

  • Búsqueda por campo específico (por ejemplo, título, autor, contenido)

Zend_Search_Lucene se derivó del proyecto Apache Lucene. Las versiones del formato de índice de Lucene soportadas actualmente (a partir de ZF 1.6) son 1.4 - 2.3. Para más información sobre Lucene, visite http://lucene.apache.org/java/docs/.

[Note]

Las implementaciones anteriores de Zend_Search_Lucene soportan los formatos de índice Lucene 1.4 (1.9) - 2.1.

A partir de Zend Framework 1.5, cualquier índice creado usando un formato de índice anterior a 2.1 se actualiza automáticamente al formato Lucene 2.1 después de la actualización de Zend_Search_Lucene y no será compatible con las implementaciones de Zend_Search_Lucene incluidas en Zend Framework 1.0.x.

61.1.2. Objetos Document y Field

Zend_Search_Lucene opera con documentos como objetos atómicos para la indexación. Un documento se divide en campos con nombre, y los campos tienen contenido que puede ser buscado.

Un documento está representado por la clase Zend_Search_Lucene_Document, y los objetos de esta clase contienen instancias de Zend_Search_Lucene_Field que representan los campos del documento.

Es importante señalar que se puede añadir cualquier información al índice. La información o los metadatos específicos de la aplicación pueden almacenarse en los campos del documento y recuperarse posteriormente junto con el documento durante la búsqueda.

Es responsabilidad de su aplicación controlar el indexador. Esto significa que los datos pueden indexarse desde cualquier fuente a la que su aplicación tenga acceso. Por ejemplo, esto podría ser el sistema de archivos, una base de datos, un formulario HTML, etc.

La clase Zend_Search_Lucene_Field proporciona varios métodos estáticos para crear campos con diferentes características:

$doc = new Zend_Search_Lucene_Document();

// Field is not tokenized, but is indexed and stored within the index.
// Stored fields can be retrived from the index.
$doc->addField(Zend_Search_Lucene_Field::Keyword('doctype',
                                                 'autogenerated'));

// Field is not tokenized nor indexed, but is stored in the index.
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
                                                   time()));

// Binary String valued Field that is not tokenized nor indexed,
// but is stored in the index.
$doc->addField(Zend_Search_Lucene_Field::Binary('icon',
                                                $iconData));

// Field is tokenized and indexed, and is stored in the index.
$doc->addField(Zend_Search_Lucene_Field::Text('annotation',
                                              'Document annotation text'));

// Field is tokenized and indexed, but is not stored in the index.
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
                                                  'My document content'));

Cada uno de estos métodos (excluyendo el método Zend_Search_Lucene_Field::Binary()) tiene un parámetro opcional $encoding para especificar la codificación de los datos de entrada.

La codificación puede variar entre distintos documentos, así como entre distintos campos dentro de un mismo documento:

$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Text('title',
                                              $title,
                                              'iso-8859-1'));
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
                                                  $contents,
                                                  'utf-8'));

Si se omite el parámetro de codificación, se utiliza la configuración regional (locale) actual en el momento del procesamiento. Por ejemplo:

setlocale(LC_ALL, 'de_DE.iso-8859-1');
...
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $contents));

Los campos siempre se almacenan y se devuelven del índice en codificación UTF-8. Cualquier conversión necesaria a UTF-8 ocurre automáticamente.

Los analizadores de texto (vea más abajo) también pueden convertir el texto a otras codificaciones. De hecho, el analizador por defecto convierte el texto a la codificación 'ASCII//TRANSLIT'. Tenga cuidado, sin embargo; esta traducción puede depender de la configuración regional actual.

Los nombres de los campos se definen a su criterio en el método addField().

Java Lucene utiliza el campo 'contents' como campo de búsqueda por defecto. Zend_Search_Lucene busca en todos los campos por defecto, pero el comportamiento es configurable. Vea el capítulo "Campo de búsqueda por defecto" para más detalles.

61.1.3. Entendiendo los tipos de campo

  • Los campos Keyword se almacenan e indexan, lo que significa que pueden buscarse y también mostrarse en los resultados de búsqueda. No se dividen en palabras separadas mediante tokenización. Los campos de base de datos enumerados suelen traducirse bien a campos Keyword en Zend_Search_Lucene.

  • Los campos UnIndexed no son buscables, pero se devuelven con los resultados de búsqueda. Las marcas de tiempo de bases de datos, claves primarias, rutas del sistema de archivos y otros identificadores externos son buenos candidatos para campos UnIndexed.

  • Los campos Binary no se tokenizan ni se indexan, pero se almacenan para su recuperación junto con los resultados de búsqueda. Pueden usarse para almacenar cualquier dato codificado como una cadena binaria, como un icono de imagen.

  • Los campos Text se almacenan, indexan y tokenizan. Los campos Text son apropiados para almacenar información como asuntos y títulos que necesitan ser buscables además de devueltos con los resultados de búsqueda.

  • Los campos UnStored se tokenizan e indexan, pero no se almacenan en el índice. Las grandes cantidades de texto se indexan mejor usando este tipo de campo. Almacenar datos crea un índice más grande en disco, así que si necesita buscar pero no volver a mostrar los datos, use un campo UnStored. Los campos UnStored son prácticos cuando se usa un índice de Zend_Search_Lucene en combinación con una base de datos relacional. Puede indexar campos de datos grandes con campos UnStored para su búsqueda, y recuperarlos de su base de datos relacional usando un campo separado como identificador.

    Tabla 61.1. Tipos de Zend_Search_Lucene_Field

    Tipo de campo Almacenado Indexado Tokenizado Binario
    Keyword No No
    UnIndexed No No No
    Binary No No
    Text No
    UnStored No No

61.1.4. Documentos HTML

Zend_Search_Lucene ofrece una funcionalidad de análisis de HTML. Los documentos pueden crearse directamente a partir de un archivo o una cadena HTML:

$doc = Zend_Search_Lucene_Document_Html::loadHTMLFile($filename);
$index->addDocument($doc);
...
$doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
$index->addDocument($doc);

La clase Zend_Search_Lucene_Document_Html utiliza los métodos DOMDocument::loadHTML() y DOMDocument::loadHTMLFile() para analizar el HTML de origen, por lo que no necesita que el HTML esté bien formado ni que sea XHTML. Por otro lado, es sensible a la codificación especificada por la etiqueta de cabecera "meta http-equiv".

La clase Zend_Search_Lucene_Document_Html reconoce el título, el cuerpo y las etiquetas meta de cabecera del documento.

El campo 'title' es en realidad el valor de /html/head/title. Se almacena en el índice, se tokeniza y está disponible para la búsqueda.

El campo 'body' es el contenido real del cuerpo del archivo o cadena HTML. No incluye scripts, comentarios ni atributos.

Los métodos loadHTML() y loadHTMLFile() de la clase Zend_Search_Lucene_Document_Html también tienen un segundo argumento opcional. Si se establece en TRUE, entonces el contenido del cuerpo también se almacena en el índice y puede recuperarse del mismo. Por defecto, el cuerpo se tokeniza e indexa, pero no se almacena.

El tercer parámetro de los métodos loadHTML() y loadHTMLFile() especifica opcionalmente la codificación del documento HTML de origen. Se utiliza si la codificación no se especifica mediante la etiqueta meta Content-type HTTP-EQUIV.

Otras etiquetas meta de cabecera del documento producen campos adicionales del documento. El campo 'name' se toma del atributo 'name', y el atributo 'content' rellena el campo 'value'. Ambos se tokenizan, indexan y almacenan, de modo que los documentos pueden buscarse por sus etiquetas meta (por ejemplo, por palabras clave).

Los documentos analizados pueden ser aumentados por el programador con cualquier otro campo:

$doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
                                                   time()));
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('updated',
                                                   time()));
$doc->addField(Zend_Search_Lucene_Field::Text('annotation',
                                              'Document annotation text'));
$index->addDocument($doc);

Los enlaces del documento no se incluyen en el documento generado, pero pueden recuperarse con los métodos Zend_Search_Lucene_Document_Html::getLinks() y Zend_Search_Lucene_Document_Html::getHeaderLinks():

$doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
$linksArray = $doc->getLinks();
$headerLinksArray = $doc->getHeaderLinks();

A partir de Zend Framework 1.6 también es posible excluir enlaces con el atributo rel establecido a 'nofollow'. Use Zend_Search_Lucene_Document_Html::setExcludeNoFollowLinks($true) para activar esta opción.

El método Zend_Search_Lucene_Document_Html::getExcludeNoFollowLinks() devuelve el estado actual del indicador "Excluir enlaces nofollow".

61.1.5. Documentos Word 2007

Zend_Search_Lucene ofrece una funcionalidad de análisis de Word 2007. Los documentos pueden crearse directamente a partir de un archivo Word 2007:

$doc = Zend_Search_Lucene_Document_Docx::loadDocxFile($filename);
$index->addDocument($doc);

La clase Zend_Search_Lucene_Document_Docx utiliza la clase ZipArchive y los métodos de simplexml para analizar el documento de origen. Si la clase ZipArchive (del módulo php_zip) no está disponible, Zend_Search_Lucene_Document_Docx tampoco estará disponible para su uso con Zend Framework.

La clase Zend_Search_Lucene_Document_Docx reconoce los metadatos y el texto del documento. Los metadatos consisten, dependiendo del contenido del documento, en el nombre de archivo, título, asunto, creador, palabras clave, descripción, lastModifiedBy, revisión, fecha de modificación, fecha de creación.

El campo 'filename' es el nombre real del archivo Word 2007.

El campo 'title' es el título real del documento.

El campo 'subject' es el asunto real del documento.

El campo 'creator' es el creador real del documento.

El campo 'keywords' contiene las palabras clave reales del documento.

El campo 'description' es la descripción real del documento.

El campo 'lastModifiedBy' es el nombre de usuario que modificó el documento por última vez.

El campo 'revision' es el número de revisión real del documento.

El campo 'modified' es la fecha/hora real de la última modificación del documento.

El campo 'created' es la fecha/hora real de creación del documento.

El campo 'body' es el contenido real del cuerpo del documento Word 2007. Solo incluye texto normal; los comentarios y las revisiones no se incluyen.

El método loadDocxFile() de la clase Zend_Search_Lucene_Document_Docx también tiene un segundo argumento opcional. Si se establece en TRUE, entonces el contenido del cuerpo también se almacena en el índice y puede recuperarse del mismo. Por defecto, el cuerpo se tokeniza e indexa, pero no se almacena.

Los documentos analizados pueden ser aumentados por el programador con cualquier otro campo:

$doc = Zend_Search_Lucene_Document_Docx::loadDocxFile($filename);
$doc->addField(Zend_Search_Lucene_Field::UnIndexed(
    'indexTime',
    time())
);
$doc->addField(Zend_Search_Lucene_Field::Text(
    'annotation',
    'Document annotation text')
);
$index->addDocument($doc);

61.1.6. Documentos Powerpoint 2007

Zend_Search_Lucene ofrece una funcionalidad de análisis de Powerpoint 2007. Los documentos pueden crearse directamente a partir de un archivo Powerpoint 2007:

$doc = Zend_Search_Lucene_Document_Pptx::loadPptxFile($filename);
$index->addDocument($doc);

La clase Zend_Search_Lucene_Document_Pptx utiliza la clase ZipArchive y los métodos de simplexml para analizar el documento de origen. Si la clase ZipArchive (del módulo php_zip) no está disponible, Zend_Search_Lucene_Document_Pptx tampoco estará disponible para su uso con Zend Framework.

La clase Zend_Search_Lucene_Document_Pptx reconoce los metadatos y el texto del documento. Los metadatos consisten, dependiendo del contenido del documento, en el nombre de archivo, título, asunto, creador, palabras clave, descripción, lastModifiedBy, revisión, fecha de modificación, fecha de creación.

El campo 'filename' es el nombre real del archivo Powerpoint 2007.

El campo 'title' es el título real del documento.

El campo 'subject' es el asunto real del documento.

El campo 'creator' es el creador real del documento.

El campo 'keywords' contiene las palabras clave reales del documento.

El campo 'description' es la descripción real del documento.

El campo 'lastModifiedBy' es el nombre de usuario que modificó el documento por última vez.

El campo 'revision' es el número de revisión real del documento.

El campo 'modified' es la fecha/hora real de la última modificación del documento.

El campo 'created' es la fecha/hora real de creación del documento.

El campo 'body' es el contenido real de todas las diapositivas y las notas de diapositiva del documento Powerpoint 2007.

El método loadPptxFile() de la clase Zend_Search_Lucene_Document_Pptx también tiene un segundo argumento opcional. Si se establece en TRUE, entonces el contenido del cuerpo también se almacena en el índice y puede recuperarse del mismo. Por defecto, el cuerpo se tokeniza e indexa, pero no se almacena.

Los documentos analizados pueden ser aumentados por el programador con cualquier otro campo:

$doc = Zend_Search_Lucene_Document_Pptx::loadPptxFile($filename);
$doc->addField(Zend_Search_Lucene_Field::UnIndexed(
    'indexTime',
    time()));
$doc->addField(Zend_Search_Lucene_Field::Text(
    'annotation',
    'Document annotation text'));
$index->addDocument($doc);

61.1.7. Documentos Excel 2007

Zend_Search_Lucene ofrece una funcionalidad de análisis de Excel 2007. Los documentos pueden crearse directamente a partir de un archivo Excel 2007:

$doc = Zend_Search_Lucene_Document_Xlsx::loadXlsxFile($filename);
$index->addDocument($doc);

La clase Zend_Search_Lucene_Document_Xlsx utiliza la clase ZipArchive y los métodos de simplexml para analizar el documento de origen. Si la clase ZipArchive (del módulo php_zip) no está disponible, Zend_Search_Lucene_Document_Xlsx tampoco estará disponible para su uso con Zend Framework.

La clase Zend_Search_Lucene_Document_Xlsx reconoce los metadatos y el texto del documento. Los metadatos consisten, dependiendo del contenido del documento, en el nombre de archivo, título, asunto, creador, palabras clave, descripción, lastModifiedBy, revisión, fecha de modificación, fecha de creación.

El campo 'filename' es el nombre real del archivo Excel 2007.

El campo 'title' es el título real del documento.

El campo 'subject' es el asunto real del documento.

El campo 'creator' es el creador real del documento.

El campo 'keywords' contiene las palabras clave reales del documento.

El campo 'description' es la descripción real del documento.

El campo 'lastModifiedBy' es el nombre de usuario que modificó el documento por última vez.

El campo 'revision' es el número de revisión real del documento.

El campo 'modified' es la fecha/hora real de la última modificación del documento.

El campo 'created' es la fecha/hora real de creación del documento.

El campo 'body' es el contenido real de todas las celdas de todas las hojas de cálculo del documento Excel 2007.

El método loadXlsxFile() de la clase Zend_Search_Lucene_Document_Xlsx también tiene un segundo argumento opcional. Si se establece en TRUE, entonces el contenido del cuerpo también se almacena en el índice y puede recuperarse del mismo. Por defecto, el cuerpo se tokeniza e indexa, pero no se almacena.

Los documentos analizados pueden ser aumentados por el programador con cualquier otro campo:

$doc = Zend_Search_Lucene_Document_Xlsx::loadXlsxFile($filename);
$doc->addField(Zend_Search_Lucene_Field::UnIndexed(
    'indexTime',
    time()));
$doc->addField(Zend_Search_Lucene_Field::Text(
    'annotation',
    'Document annotation text'));
$index->addDocument($doc);