Tabla de contenidos
- 61.1. Resumen
- 61.2. Construcción de índices
- 61.3. Búsqueda en un índice
- 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.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.6. Juego de caracteres
- 61.7. Extensibilidad
- 61.8. Interoperación con Java Lucene
- 61.9. Avanzado
- 61.10. Buenas prácticas
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/.
![]() |
|
|
Las implementaciones anteriores de
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 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.
Los campos
Keywordse 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 enZend_Search_Lucene.Los campos
UnIndexedno 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
Binaryno 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
Textse 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
UnStoredse 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 deZend_Search_Luceneen 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 Sí Sí No No UnIndexed Sí No No No Binary Sí No No Sí Text Sí Sí Sí No UnStored No Sí Sí No
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".
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);
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);
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);
![[Note]](images/note.png)