Zend_Search_Lucene в своей работе использует кодировку UTF-8. Файлы индекса хранят данные unicode в кодировке Modified UTF-8 от Java. Ядро Zend_Search_Lucene полностью поддерживает его за одним исключением. [8]
Действующая кодировка для входных данных может быть указана через API Zend_Search_Lucene. Данные будут автоматически преобразованы в кодировку UTF-8.
Несмотря на это, используемый по умолчанию анализатор текста
(который также применяется в парсере запросов) использует
ctype_alpha()
для разбиения текста и поисковых
запросов на лексемы.
ctype_alpha()
не является совместимым с UTF-8, поэтому
анализатор конвертирует текст в кодировку 'ASCII//TRANSLIT' до
индексации. То же самое выполняется при парсинге запросов.
[9]
Zend_Search_Lucene также содержит совместимый с UTF-8 анализатор текста с ограниченным функционалом.
<?php Zend_Search_Lucene_Analysis_Analyzer::setDefault( new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
Он разбивает на лексемы данные для индексации в режиме UTF-8, не испытывая проблем с любыми входящими в UTF-8 символами.
Данный анализатор имеет два ограничения:
обрабатывает все не входящие в кодировку ASCII как буквы;
является чувствительным к регистру;
Из-за этих ограничений он не используется по умолчанию, но может быть полезен некоторым.
Нечувствительность к регистру может быть сэмулирована с помощью
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))); // Поле заголовка для поиска // (индексируется, но не сохраняется в индексе) $doc->addField(Zend_Search_Lucene_Field::UnStored('title', strtolower($title))); // Поле заголовка для возвращения в результатах поиска // (не индексируется, но сохраняется) $doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));
То же самое преобразование должно выполняться и для запросов:
<?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));
[8] Zend_Search_Lucene поддерживает только символы Basic Multilingual Plane (от 0x0000 до 0xFFFF) и не поддерживает дополнительные символы (символы, чьи коды больше 0xFFFF).
Java 2 представляет эти символыв виде пары значений символьного типа (16 бит), перое из диапазона 0xD800-0xDBFF, второе из диапазона 0xDC00-0xDFFF. Тогда они кодируются как обычные символы UTF-8 в шести байтах. Стандартное представление UTF-8 использует четыре байта для дополнительных символов.
[9] Преобразование в 'ASCII//TRANSLIT' может зависеть от текущей локали и операционной системы.