Zend_Search_Lucene trabaja internamente con el conjunto de caracteres UTF-8. Los
archivos de índice almacenan datos unicode en la "codificación UTF-8 modificada" de Java.
El núcleo de Zend_Search_Lucene soporta completamente esta codificación con
una excepción.
[15]
La codificación real de los datos de entrada puede especificarse a través de la
API de Zend_Search_Lucene. Los datos se
convertirán automáticamente a codificación UTF-8.
Sin embargo, el analizador de texto por defecto (que también se usa dentro del analizador de consultas) usa ctype_alpha() para tokenizar el texto y las consultas.
ctype_alpha() no es compatible con UTF-8, por lo que el analizador convierte el texto a codificación 'ASCII//TRANSLIT' antes de indexar. El mismo procesamiento se realiza de manera transparente durante el análisis de la consulta. [16]
![]() |
|
El analizador por defecto no trata los números como parte de los términos. Use el analizador 'Num' correspondiente si no desea que las palabras se dividan por números. |
Zend_Search_Lucene también contiene un conjunto de analizadores
compatibles con UTF-8: Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8,
Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num,
Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive,
Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive.
Cualquiera de estos analizadores puede habilitarse con un código como el siguiente:
Zend_Search_Lucene_Analysis_Analyzer::setDefault(
new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
![]() |
|
|
Los analizadores compatibles con UTF-8 se mejoraron en Zend Framework 1.5. Las primeras versiones de los analizadores asumían que todos los caracteres no-ascii eran letras. La nueva implementación de los analizadores tiene un comportamiento más preciso. Esto puede requerir que reconstruya el índice para que los datos y las consultas de búsqueda se tokenicen de la misma manera, de lo contrario el motor de búsqueda puede devolver conjuntos de resultados incorrectos. |
Todos estos analizadores necesitan que la biblioteca PCRE (Perl-compatible regular expressions) esté compilada con el soporte UTF-8 activado. El soporte UTF-8 de PCRE está activado para las fuentes de la biblioteca PCRE incluidas en la distribución de fuentes de PHP, pero si se usa una biblioteca compartida en lugar de la incluida con las fuentes de PHP, entonces el estado del soporte UTF-8 puede depender de su sistema operativo.
Use el siguiente código para comprobar si el soporte UTF-8 de PCRE está habilitado:
if (@preg_match('/\pL/u', 'a') == 1) {
echo "PCRE unicode support is turned on.\n";
} else {
echo "PCRE unicode support is turned off.\n";
}
Las versiones sensibles a mayúsculas/minúsculas de los analizadores compatibles con UTF-8 también necesitan que la extensión mbstring esté habilitada.
Si no desea que la extensión mbstring esté activada, pero necesita una búsqueda insensible a mayúsculas/minúsculas, puede usar el siguiente enfoque: normalice los datos de origen antes de indexar y la cadena de consulta antes de buscar, convirtiéndolos a minúsculas:
// Indexing
setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
...
Zend_Search_Lucene_Analysis_Analyzer::setDefault(
new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
...
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
strtolower($contents)));
// Title field for search through (indexed, unstored)
$doc->addField(Zend_Search_Lucene_Field::UnStored('title',
strtolower($title)));
// Title field for retrieving (unindexed, stored)
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));
// Searching
setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
...
Zend_Search_Lucene_Analysis_Analyzer::setDefault(
new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
...
$hits = $index->find(strtolower($query));
[15]
Zend_Search_Lucene solo soporta caracteres del Plano Multilingüe
Básico (BMP) (de 0x0000 a 0xFFFF) y no soporta
"caracteres suplementarios" (caracteres cuyos puntos de código son
mayores que 0xFFFF)
Java 2 representa estos caracteres como un par de valores char (16 bits), el primero del rango de "high-surrogates" (0xD800-0xDBFF), el segundo del rango de "low-surrogates" (0xDC00-0xDFFF). Luego se codifican como caracteres UTF-8 normales en seis bytes. La representación UTF-8 estándar usa cuatro bytes para los caracteres suplementarios.
[16] La conversión a 'ASCII//TRANSLIT' puede depender del locale y del sistema operativo actuales.
![[Note]](images/note.png)
![[Warning]](images/warning.png)