Zend_Search_Lucene fonctionne avec UTF-8. Les fichier d'index stockent des données unicode en JAVA "modified UTF-8 encoding". Le coeur de Zend_Search_Lucene le supporte complètement, à une exception près : [10]
L'encodage réel de données d'entrée peut être indiqué via l'API de Zend_Search_Lucene. Les données seront automatiquement converties en encodage UTF-8.
Cependant, l'analyseur de texte par défaut (qui est également employé dans l'analyseur de requête) utilise ctype_alpha()
pour fractionner les textes et les requêtes.
ctype_alpha()
n'est pas compatible UTF-8, donc l'nalyseur converti le texte en encodage 'ASCII//TRANSLIT' avant l'indexation. Le même processus est réalisé durant l'analyse de la requête, ceci est donc transparent.
[11]
Zend_Search_Lucene contient également un analyseur utf-8 aux fonctionnalités limitées. Il peut être activé avec le code suivant :
<?php Zend_Search_Lucene_Analysis_Analyzer::setDefault( new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8()); ?>
Il fractionne les données pour indexer en mode UTF-8 et n'a aucun problème avec les caractères UTF-8 compatibles.
Il a deux limitations :
il traite tous les caractères non-ASCII comme des lettres (ce n'est pas toujours vrai) ;
il est sensible à la casse.
En raison de ces limitations il n'est pas activé par défaut, mais peut être utile pour quelqu'un.
L'insensibilité à la casse peut être émulé avec la fonction strtolower()
:
<?php 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)); ?>
La même conversion doit alors être fait avec la chaîne de requête :
<?php 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)); ?>
[10] Zend_Search_Lucene supporte uniquement les caractères BMP (Basic Multilingual Plane, de 0x0000 à 0xFFFF) et ne supporte pas les "caractères supplémentaires" (ceux dont le code est supérieur à 0xFFFF).
Java 2 représente ces caractères comme une paire de valeurs de type char (16-bit), en premier la demi-zone haute (0xD800-0xDBFF), en deuxième la demi-zone basse (0xDC00-0xDFFF). Ensuite tout est encodé comme des caractères UTF-8 habituels dans six octets. La représentation standard d'UTF-8 utilise quatre octets pour les caractères supplémentaires.
[11] La conversion en 'ASCII//TRANSLIT' peut dépendre de la localisation et de l'OS.