Zeichensätze

Erweiterbarkeit

Textanalyse

Die Zend_Search_Lucene_Analysis_Analyzer Klasse wird vom Indexer verwendet, um die Textfelder der Dokumente in Abschnitte aufzuteilen.

Die Zend_Search_Lucene_Analysis_Analyzer::getDefault() und Zend_Search_Lucene_Analysis_Analyzer::setDefault() Methoden werden verwendet, um den Standardanalysator zu bekommen oder festzulegen.

Man kann einen eigenen Textanalysator zuordnen oder ihn aus den vordefinierten Analysatoren auswählen: Zend_Search_Lucene_Analysis_Analyzer_Common_Text und Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive (Standard). Beide interpretieren einen Abschnitt als eine Sequenz aus Buchstaben. Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive konvertiert alle Abschnitte in Kleinbuchstaben.

Um zwischen Analysatoren zu wechseln:

  1.  

Die Zend_Search_Lucene_Analysis_Analyzer_Common Klasse wurde als Anker für alle benutzerdefinierten Analysatoren entwickelt. Benutzer sollten nur die reset() und nextToken() Methoden definieren, welche ihren String von der $_input Eigenschaft nimmt und die Abschnitte Stück für Stück zurückgibt (ein NULL Wert indiziert das Ende des Streams).

Die nextToken() Methode sollte die normalize() Methode auf jedem Token aufrufen. Das erlaubt die Verwendung von Abschnittsfiltern im eigenen Analysator.

Hier ist ein Beispiel für einen eigenen Analysator, welcher Wörter mit Ziffern als Begriffe akzeptiert:

Example #1 Eigener Textanalysator

  1. /**
  2. * Hier ist ein eigener Textanalysator, der Worte mit Ziffern
  3. * als einen Begriff behandelt
  4. *//**
  5.      * Setzt den Token Stream zurück
  6.      *//**
  7.      * Tokenization stream API
  8.      * Get next token
  9.      * Returns null at the end of stream
  10.      *
  11.      * @return Zend_Search_Lucene_Analysis_Token|null
  12.      */// skip white space
  13. // read token
  14. // Empty token, end of stream.
  15. // Continue if token is skipped

Filtern von Tokens

Der Zend_Search_Lucene_Analysis_Analyzer_Common Analisator bietet auch einen Mechanismus zum Filtern von Tokens.

Die Zend_Search_Lucene_Analysis_TokenFilter Klasse bietet ein abstraktes Interface für solche Filter. Eigene Filter sollten diese Klasse direkt oder indirekt erweitern.

Alle eigenen Filter müssen die normalize() Methode implementieren, welche den Eingabe Token verändern oder signalisieren, dass der Token übersprungen werden sollte.

Es gibt bereits drei Filter die im Analyse Unterpaket definierte sind:

  • Zend_Search_Lucene_Analysis_TokenFilter_LowerCase

  • Zend_Search_Lucene_Analysis_TokenFilter_ShortWords

  • Zend_Search_Lucene_Analysis_TokenFilter_StopWords

Der LowerCase Filter wird bereits standardmäßig für den Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive Analysator verwendet.

Die ShortWords und StopWords Filter können mit bereits definierten oder eigenen Analysatoren wie folgt verwendet werden:

  1. span style="color: #ff0000;">'a', 'an', 'at', 'the', 'and', 'or', 'is', 'am'
  1.  

Der Zend_Search_Lucene_Analysis_TokenFilter_StopWords Konstruktor nimmt ein Array mit Stopwörtern als Eingabe entgegen. Aber Stopwörter können auch aus einer Datei geladen werden:

  1.  

Die Datei sollte eine normale Textdatei mit einem Wort pro Zeile sein. Das '#' Zeichen markiert eine Zeile als Kommentar.

Der Zend_Search_Lucene_Analysis_TokenFilter_ShortWords Konstruktor hat ein optionales Argument. Es ist das Limit für die Wortlänge, der standardmäßig 2 ist.

Algorithmen für Punktwertermittlung

Der Punktwert einer Abfrage q für das Dokument d ist wie folgt definiert:

score(q,d) = sum( tf(t in d) * idf(t) * getBoost(t.field in d) * lengthNorm(t.field in d) ) * coord(q,d) * queryNorm(q)

tf(t in d) - Zend_Search_Lucene_Search_Similarity::tf($freq) - ein Punktwertfaktor, der auf der Häufigkeit des Begriffes oder der Phrase innerhalb des Dokuments basiert.

idf(t) - Zend_Search_Lucene_Search_Similarity::idf($input, $reader) - ein Punktwertfaktor für einen einfachen Begriff mit dem spezifischen Index.

getBoost(t.field in d) - der Verstärkungsfaktor für das Begriffsfeld.

lengthNorm($term) - der Normalisierungswert für ein Feld, der die Gesamtzahl der Begriffe innerhalb eines Fields enthält. Dieser Wert wird im Index abgelegt. Diese Wert werden zusammen mit dem Verstärkungsfaktor im Index abgelegt und vom Suchcode für alle Treffer eines Feldes zu Punktwerten multipliziert.

Treffer in längeren Feldern sind weniger präzise, so dass Implementierungen dieser Methode normalerweise kleinere Werte zurückgeben, wenn numTokens groß ist, und größere Werte, wenn numTokens klein ist.

coord(q,d) - Zend_Search_Lucene_Search_Similarity::coord($overlap, $maxOverlap) - ein Punktwertfaktor, der auf dem Anteil aller Abfragebegriffe basiert, die ein Dokument enthält.

Das Vorhandensein eines grossen Teils der Abfragebegriffe gibt einen besseren Treffer für die Abfrage an, so dass Implementierungen dieser Methode normalerweise größere Werte zurückgeben, wenn das Verhältnis zwischen diesen Parametern groß ist, und kleinere Werte, wenn es klein ist.

queryNorm(q) - der Normalisierungswert für eine Abfrage, welcher die Summe der quadrierten Gewichtungen jedes Begriffes eine Abfrage enthält. Dieser Wert wird für das Gewicht jedes Abfragebegriffes multipliziert. term.

Dieses wirkt sich nicht auf die Reihenfolge ist, versucht aber, die Punktwerte für verschiedenen Abfragen vergleichbar zu machen.

Der Algorithmen für die Punktwertermittlung kann durch die Definition einer eigenen Ähnlichkeitsklasse angepasst werden. Hierfür muss die Zend_Search_Lucene_Search_Similarity Klasse wie unten angegeben erweitert und anschließend die Zend_Search_Lucene_Search_Similarity::setDefault($similarity); Methode verwendet werden um Sie als Standard zu setzen.

  1. span style="color: #808080; font-style: italic;">/**
  2.      * Es wird jetzt nicht verwendet. Berechnet den Wert eines Treffers
  3.      * für eine ungenauen Phrasenanfrage.
  4.      */

Storage Container

Die abstrakte Klasse Zend_Search_Lucene_Storage_Directory definiert Funktionalitäten für Verzeichnisse.

Der Zend_Search_Lucene Konstruktur verwendet als Eingabe entweder einen String oder ein Zend_Search_Lucene_Storage_Directory Objekt.

Die Zend_Search_Lucene_Storage_Directory_Filesystem Klasse implementiert Verzeichnisfunktionalitäten für ein Dateisystem.

Wenn ein String als Eingabe für den Zend_Search_Lucene Konstruktur verwendet wird, behandelt der Indexleser (das Zend_Search_Lucene Objekt) es wie einen Dateipfad und instanziiert das Zend_Search_Lucene_Storage_Directory_Filesystem Objekt.

Du kannst deinen eigenen Verzeichnisimplementation durch die Erweiterung der Zend_Search_Lucene_Storage_Directory Klasse definieren.

Zend_Search_Lucene_Storage_Directory Methoden:

  1. span style="color: #808080; font-style: italic;">/**
  2. * Schließt den Speicher
  3. *
  4. * @return void
  5. *//**
  6. * Erstellt im Verzeichnis eine neue, leere Datei mit dem übergebenen Dateinamen $filename.
  7. *
  8. * @param string $name
  9. * @return void
  10. *//**
  11. * Entfernt eine vorhande Datei $filename aus dem Verzeichnis.
  12. *
  13. * @param string $filename
  14. * @return void
  15. *//**
  16. * Gibt true zurück, wenn eine Datei mit dem übergebenen Dateinamen $filename existiert
  17. *
  18. * @param string $filename
  19. * @return boolean
  20. *//**
  21. * Gibt die länge eine Datei $filename im Verzeichnis zurück
  22. *
  23. * @param string $filename
  24. * @return integer
  25. *//**
  26. * Gibt den UNIX Zeitstempel für die letzte Änderung der Datei $filename zurück.
  27. *
  28. * @param string $filename
  29. * @return integer
  30. *//**
  31. * Benennt eine vorhandene Datei im Verzeichnis um.
  32. *
  33. * @param string $from
  34. * @param string $to
  35. * @return void
  36. *//**
  37. * Ändert die Änderungstzeit der Datei $filename auf jetzt um
  38. *
  39. * @param string $filename
  40. * @return void
  41. *//**
  42. * Gibt ein Zend_Search_Lucene_Storage_File Objekt für den^
  43. * Dateinamen $filename aus dem Verzeichnis zurück.
  44. *
  45. * @param string $filename
  46. * @return Zend_Search_Lucene_Storage_File
  47. */

Die getFileObject($filename) Methode einer Zend_Search_Lucene_Storage_Directory Instanz gibt ein Zend_Search_Lucene_Storage_File Objekt zurück.

Die abstrakte Klasse Zend_Search_Lucene_Storage_File implementiert einfache Funktionen für Dateiabstraktion und das Lesen von Indexdateien.

Es muß außerdem Zend_Search_Lucene_Storage_File für eine eigene Verzeichnisimplementation erweitert werden.

Nur zwei Methoden der Zend_Search_Lucene_Storage_File Klasse müssen in der eigenen Implementation überschrieben werden:

  1. span style="color: #808080; font-style: italic;">/**
  2.      * Setzt den Indikator für die Dateiposition rückt den Dateizeiger
  3.      * voran. Die neue Position, gemessen in Bytes vom Dateianfangm
  4.      * wird erreicht durch das Hinzufügen eines Versatzes zu der
  5.      * angegebenen Position. Dessen Werte sind wie folgt definiert:
  6.      * SEEK_SET - Setze die Position auf den Versatz.
  7.      * SEEK_CUR - Setze die Position auf die aktuelle Position plus Versatz.
  8.      * SEEK_END - Setze die Position aufs Dateisende plus Versatz. (Um den
  9.      * Zeiger auf eine Position vor dem Dateiende zu bewegen, übergebe einen
  10.      * negativen Wert als Versatz.)
  11.      * Bei Erfolg wird 0, andernfalls -1 zurückgegeben
  12.      *
  13.      * @param integer $offset
  14.      * @param integer $whence
  15.      * @return integer
  16.      *//**
  17.      * Lese $length Bytes aus der Datei und setze den Dateizeiger vor.
  18.      *
  19.      * @param integer $length
  20.      * @return string
  21.      */

Zeichensätze