27.6. Jeux de caractères.

27.6.1. Support d'UTF-8 et de jeux de caractères mono-octet.

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.

27.6.2. Analyseur textuel par défaut

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]

27.6.3. Analysseur textuel compatible UTF-8

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.