TigerZF
🌐Español

61.4. Lenguaje de consulta

Java Lucene y Zend_Search_Lucene proporcionan lenguajes de consulta bastante potentes.

Estos lenguajes son mayormente iguales, con algunas diferencias menores que se mencionan a continuación.

La documentación completa de la sintaxis del lenguaje de consulta de Java Lucene se puede encontrar aquí.

61.4.1. Términos

Una consulta se descompone en términos y operadores. Existen tres tipos de términos: Términos simples, Frases y Subconsultas.

Un término simple es una sola palabra como "test" o "hello".

Una frase es un grupo de palabras rodeado por comillas dobles, como "hello dolly".

Una subconsulta es una consulta rodeada de paréntesis, como "(hello dolly)".

Múltiples términos pueden combinarse mediante operadores booleanos para formar consultas complejas (ver más abajo).

61.4.2. Campos

Lucene soporta campos de datos. Al realizar una búsqueda puede especificar un campo, o usar el campo predeterminado. Los nombres de los campos dependen de los datos indexados y el campo predeterminado se define mediante la configuración actual.

La primera y más significativa diferencia con Java Lucene es que los términos se buscan en todos los campos por defecto.

Existen dos métodos estáticos en la clase Zend_Search_Lucene que permiten al desarrollador configurar estos ajustes:

$defaultSearchField = Zend_Search_Lucene::getDefaultSearchField();
...
Zend_Search_Lucene::setDefaultSearchField('contents');

El valor NULL indica que la búsqueda se realiza en todos los campos. Es la configuración predeterminada.

Puede buscar en campos específicos escribiendo el nombre del campo seguido de dos puntos ":" seguido por el término que está buscando.

Como ejemplo, supongamos que un índice de Lucene contiene dos campos - title y text - con text como campo predeterminado. Si desea encontrar el documento titulado "The Right Way" que contiene el texto "don't go this way", puede escribir:

title:"The Right Way" AND text:go

o

title:"Do it right" AND go

Debido a que "text" es el campo predeterminado, no se requiere el indicador de campo.

Nota: El campo solo es válido para el término, frase o subconsulta que precede directamente, por lo que la consulta

title:Do it right

Solo encontrará "Do" en el campo title. Encontrará "it" y "right" en el campo predeterminado (si el campo predeterminado está configurado) o en todos los campos indexados (si el campo predeterminado está configurado a NULL).

61.4.3. Comodines

Lucene soporta búsquedas con comodines de un solo carácter y de múltiples caracteres dentro de términos individuales (pero no dentro de consultas de frase).

Para realizar una búsqueda con comodín de un solo carácter use el símbolo "?".

Para realizar una búsqueda con comodín de múltiples caracteres use el símbolo "*".

La búsqueda con comodín de un solo carácter busca cadenas que coincidan con el término con el "?" reemplazado por cualquier carácter único. Por ejemplo, para buscar "text" o "test" puede usar la búsqueda:

te?t

Las búsquedas con comodín de múltiples caracteres buscan 0 o más caracteres al comparar cadenas contra términos. Por ejemplo, para buscar test, tests o tester, puede usar la búsqueda:

test*

Puede usar "?", "*" o ambos en cualquier posición del término:

*wr?t*

Esto busca "write", "wrote", "written", "rewrite", "rewrote", etc.

A partir de ZF 1.7.7 los patrones con comodines necesitan cierto prefijo sin comodines. La longitud predeterminada del prefijo es 3 (como en Java Lucene). Así, los términos "*", "te?t", "*wr?t*" provocarán una excepción [14].

Esto se puede modificar usando los métodos Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength() y Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength().

61.4.4. Modificadores de término

Lucene soporta la modificación de términos de consulta para ofrecer una amplia gama de opciones de búsqueda.

El modificador "~" puede usarse para especificar búsqueda por proximidad en frases o búsqueda difusa (fuzzy) para términos individuales.

61.4.5. Búsquedas por rango

Las consultas por rango permiten al desarrollador o usuario buscar documentos cuyos valores de campo(s) estén entre el límite inferior y superior especificados por la consulta de rango. Las consultas por rango pueden ser inclusivas o exclusivas de los límites superior e inferior. La ordenación se realiza lexicográficamente.

mod_date:[20020101 TO 20030101]

Esto encontrará documentos cuyos campos mod_date tengan valores entre 20020101 y 20030101, inclusive. Tenga en cuenta que las consultas por rango no están reservadas para campos de fecha. También podría usar consultas por rango con campos que no sean de fecha:

title:{Aida TO Carmen}

Esto encontrará todos los documentos cuyos títulos se ordenarían entre Aida y Carmen, pero sin incluir Aida y Carmen.

Las consultas por rango inclusivas se denotan con corchetes. Las consultas por rango exclusivas se denotan con llaves.

Si no se especifica el campo, entonces Zend_Search_Lucene busca el intervalo especificado en todos los campos por defecto.

{Aida TO Carmen}

61.4.6. Búsquedas difusas

Zend_Search_Lucene, al igual que Java Lucene, soporta búsquedas difusas (fuzzy) basadas en la Distancia de Levenshtein, o algoritmo de Distancia de Edición. Para realizar una búsqueda difusa use la tilde, "~", al final de un término de una sola palabra. Por ejemplo, para buscar un término similar en ortografía a "roam" use la búsqueda difusa:

roam~

Esta búsqueda encontrará términos como foam y roams. Un parámetro adicional (opcional) puede especificar la similitud requerida. El valor está entre 0 y 1; con un valor más cercano a 1 solo se emparejarán los términos con mayor similitud. Por ejemplo:

roam~0.8

El valor predeterminado que se usa si no se proporciona el parámetro es 0.5.

61.4.7. Límite de términos coincidentes

Las consultas con comodines, rango y búsqueda difusa pueden coincidir con demasiados términos. Esto puede provocar una degradación increíble del rendimiento de búsqueda.

Por eso Zend_Search_Lucene establece un límite de términos coincidentes por consulta (subconsulta). Este límite puede obtenerse y establecerse usando los métodos Zend_Search_Lucene::getTermsPerQueryLimit() y Zend_Search_Lucene::setTermsPerQueryLimit($limit).

El límite predeterminado de términos coincidentes por consulta es 1024.

61.4.8. Búsquedas por proximidad

Lucene soporta encontrar palabras de una frase que estén dentro de una distancia de palabras especificada en una cadena. Para realizar una búsqueda por proximidad use la tilde, "~", al final de la frase. Por ejemplo, para buscar "Zend" y "Framework" dentro de 10 palabras entre sí en un documento use la búsqueda:

"Zend Framework"~10

61.4.9. Impulsar (boost) un término

Java Lucene y Zend_Search_Lucene proporcionan el nivel de relevancia de los documentos coincidentes en función de los términos encontrados. Para impulsar la relevancia de un término use el símbolo de intercalación, "^", con un factor de impulso (un número) al final del término que está buscando. Cuanto mayor sea el factor de impulso, más relevante será el término.

El impulso (boosting) le permite controlar la relevancia de un documento impulsando términos individuales. Por ejemplo, si está buscando

PHP framework

y desea que el término "PHP" sea más relevante, impúlselo usando el símbolo ^ junto con el factor de impulso al lado del término. Escribiría:

PHP^4 framework

Esto hará que los documentos con el término PHP parezcan más relevantes. También puede impulsar términos de frase y subconsultas como en el ejemplo:

"PHP framework"^4 "Zend Framework"

Por defecto, el factor de impulso es 1. Aunque el factor de impulso debe ser positivo, puede ser menor que 1 (p. ej. 0.2).

61.4.10. Operadores booleanos

Los operadores booleanos permiten combinar términos mediante operadores lógicos. Lucene soporta AND, "+", OR, NOT y "-" como operadores booleanos. Java Lucene requiere que los operadores booleanos estén en MAYÚSCULAS. Zend_Search_Lucene no lo requiere.

Los operadores AND, OR y NOT, y "+", "-", definen dos estilos diferentes de construir consultas booleanas. A diferencia de Java Lucene, Zend_Search_Lucene no permite mezclar estos dos estilos.

Si se usa el estilo AND/OR/NOT, entonces debe estar presente un operador AND u OR entre todos los términos de la consulta. Cada término también puede ir precedido por el operador NOT. El operador AND tiene mayor precedencia que el operador OR. Esto difiere del comportamiento de Java Lucene.

61.4.10.1. AND

El operador AND significa que todos los términos en el "grupo AND" deben coincidir con alguna parte de los campos buscados.

Para buscar documentos que contengan "PHP framework" y "Zend Framework" use la consulta:

"PHP framework" AND "Zend Framework"

61.4.10.2. OR

El operador OR divide la consulta en varios términos opcionales.

Para buscar documentos que contengan "PHP framework" o "Zend Framework" use la consulta:

"PHP framework" OR "Zend Framework"

61.4.10.3. NOT

El operador NOT excluye documentos que contengan el término posterior a NOT. Pero un "grupo AND" que contenga solo términos con el operador NOT devuelve un conjunto de resultados vacío en lugar del conjunto completo de documentos indexados.

Para buscar documentos que contengan "PHP framework" pero no "Zend Framework" use la consulta:

"PHP framework" AND NOT "Zend Framework"

61.4.10.4. Operadores &&, || y !

&&, || y ! pueden usarse en lugar de la notación AND, OR y NOT.

61.4.10.5. +

El operador "+" o de requerido estipula que el término posterior al símbolo "+" debe coincidir con el documento.

Para buscar documentos que deban contener "Zend" y puedan contener "Framework" use la consulta:

+Zend Framework

61.4.10.6. -

El operador "-" o de prohibición excluye documentos que coincidan con el término posterior al símbolo "-".

Para buscar documentos que contengan "PHP framework" pero no "Zend Framework" use la consulta:

"PHP framework" -"Zend Framework"

61.4.10.7. Sin operador

Si no se usa ningún operador, el comportamiento de la búsqueda se define mediante el "operador booleano por defecto".

Este está establecido en 'OR' por defecto.

Esto implica que cada término es opcional por defecto. Puede o no estar presente dentro del documento, pero los documentos con ese término recibirán una puntuación más alta.

Para buscar documentos que requieran "PHP framework" y puedan contener "Zend Framework" use la consulta:

+"PHP framework" "Zend Framework"

El operador booleano por defecto puede establecerse u obtenerse con los métodos Zend_Search_Lucene_Search_QueryParser::setDefaultOperator($operator) y Zend_Search_Lucene_Search_QueryParser::getDefaultOperator(), respectivamente.

Estos métodos operan con las constantes Zend_Search_Lucene_Search_QueryParser::B_AND y Zend_Search_Lucene_Search_QueryParser::B_OR.

61.4.11. Agrupación

Java Lucene y Zend_Search_Lucene soportan el uso de paréntesis para agrupar cláusulas y formar subconsultas. Esto puede ser útil si desea controlar la precedencia de los operadores lógicos booleanos de una consulta o mezclar diferentes estilos de consulta booleana:

+(framework OR library) +php

Zend_Search_Lucene soporta subconsultas anidadas a cualquier nivel.

61.4.12. Agrupación de campos

Lucene también soporta el uso de paréntesis para agrupar múltiples cláusulas en un solo campo.

Para buscar un título que contenga tanto la palabra "return" como la frase "pink panther" use la consulta:

title:(+return +"pink panther")

61.4.13. Escapando caracteres especiales

Lucene soporta el escape de caracteres especiales usados en la sintaxis de consulta. La lista actual de caracteres especiales es:

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \

+ y - dentro de términos individuales se tratan automáticamente como caracteres comunes.

Para otras instancias de estos caracteres use el \ antes de cada carácter especial que desee escapar. Por ejemplo, para buscar (1+1):2 use la consulta:

\(1\+1\)\:2


[14] Tenga en cuenta que no se trata de una Zend_Search_Lucene_Search_QueryParserException, sino de una Zend_Search_Lucene_Exception. Se lanza durante la operación de reescritura (ejecución) de la consulta.