Programmer's Reference Guide
| Types de requêtes |
Jeux de caractères
Support d'UTF-8 et de jeux de caractères mono-octet.
Zend_Search_Lucene fonctionne avec UTF-8. Les fichiers d'index stockent des données unicodes en JAVA "modified UTF-8 encoding". Le coeur de Zend_Search_Lucene le supporte complètement, à une exception près : [1]
L'encodage réel des 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.
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'analyseur 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.
[2]
Analyseur 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));
| Types de requêtes |
