Programmer's Reference Guide

Abfrage Erzeugungs API

Zeichensätze

Unterstützung für UTF-8 und Einzel-Byte Zeichensätze

Zend_Search_Lucene arbeitet intern mit dem UTF-8 Zeichensatz. Index Dateien speichern Unicode Daten in Java's "modifiziertem UTF-8 Codierung". Der Kern von Zend_Search_Lucene unterstützt Ihn komplett aber mit einer Ausnahme. [1]

Die Codierung der aktuellen Eingabedaten dann über die API von Zend_Search_Lucene spezifiziert werden. Daten werden automatisch in die UTF-8 Codierung konvertiert.

Standard Textanalysator

Trotzdem verwendet der Standardmäßige Textanalysator (welche auch im Anfrageparser arbeitet) ctype_alpha() für das analysieren von Text und Anfragen.

ctype_alpha() ist nicht UTf-8 kompatibel, weswegen der Analysator Text zuerst in die 'ASCII//TRANSLIT' Codierung konvertiert bevor er indiziert. Der selbe Prozess wird wärend des Parsens der Anfrage durchgeführt, er ist also komplett transparent. [2]

UTF-8 kompatibler Textanalysator

Zend_Search_Lucene enthält auch einen limitiert funktionsfähigen UTF-8 Analysator. Er kann mit dem folgenden Code eingeschaltet werden:

<?php
Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
            

Er bezeichnet Daten für das Indizieren im UTF-8 Modus und hat keine Problem mit irgendwelchen UTF-8 kompatiblen Zeichen.

Er hat zwei Einschränkungen:

  • behandelt alle nicht-ASCII Zeichen als Buchstaben (das stimmt nicht immer);

  • er unterscheidet zwischen Groß- und Kleinschreibung;

Wegen dieser Einschränkungen ist er nicht als Standard gesetzt, kann aber von Zeit zu Zeit hilfreich sein.

Unabhängigkeit von Groß- und Kleinschreibung kann emuliert werden mit einer strtolower() Konvertierung:

<?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)));

// Titel Feld für das Durchsuchen (indiziert, nicht gespeichert)
$doc->addField(Zend_Search_Lucene_Field::UnStored('title', strtolower($title)));

// Titel Feld für das Empfangen (nicht indiziert, gespeichert)
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));
            

Die selbe Konvertierung kann mit einem Abfrage String durchgeführt werden:

<?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));
            

[1] Zend_Search_Lucene unterstützt nur Basic Multilingual Plane (BMP) Zeichen (von 0x0000 bis 0xFFFF) und unterstützt keine "zusätzlichen Zeichen" (Zeichen deren Codepunkte größer als 0xFFFF sind). Java 2 zeigt diese Werte als Paare von Zeichen (16-bit) Werten an, der erste vom High-Surrogate Bereich (0xD800-0xDBFF), den zweiten vom Low-Surrogate Bereich (0xDC00-0xDFFF). Dann werden Sie als normale UTF-8 Zeichen mit sechs Bytes kodiert. Die Standard UTF-8 Repräsentation verwendet vier Bytes für zusätzliche Zeichen.
[2] Konvertierungen in 'ASCII//TRANSLIT' sind abhängig von dem aktuellen Gebietsschema und OS.

Abfrage Erzeugungs API
blog comments powered by Disqus

Select a Version

Languages Available

Components

Search the Manual