![]() ![]() |
Sie sind hier: ZWikiSeiten > ZBSearchingZCatalog Zopebuch: Inhaltsverzeichnis Dieses Dokument ist momentan noch nicht vollst�ndig �bersetzt. Kapitel 11: Inhalt durchsuchen und kategorisierenMit Zope wird eine eingebaute Suchmaschine namens ZCatalog geliefert, mit der man viele Zope-Objekte in Kategorien einteilen und nach ihnen suchen kann. Die Suchmaschine kann auch für externe Daten z. B. aus relationalen Datenbanken, Dateien und anderen Webseiten verwendet werden. Neben der Suchfunktion dient der Katalog auch zum Verwalten von Objektgruppen. Der Katalog enthält ein umfangreiches Suchformular, das eine Volltextsuche ermöglicht und gleichzeitig in mehreren Suchindizes agieren kann. Ausserdem behält ZCatalog Veränderungen der Metadaten von indizierten Objekten im Auge. ZCatalog wird in der Regel für folgende Vorgänge verwendet:
Einführung in die MassenkatalogisierungSehen wir uns an, wie man mit ZCatalog nach Dokumenten suchen kann. Wenn man eine grosse Zahl von Objekte auf einmal katalogisiert, nennt man dies Massenkatalogisierung. Die Massenkatalogisierung erfordert drei Arbeitsschritte:
Erstellen Sie mit Hilfe der Produktauswahlliste ein ZCatalog Objekt. Sie gelangen zu dem in Abbildung 9-1 gezeigten Erstellungsformular. Abbildung 9-1 ZCatalog-Erstellungsformular Das Erstellungsformular fragt nach einer Id und einem Title. Das dritte Formular-Feld ist die Vocabulary Auswahl-Box. Lassen Sie zunächst die Option "Create one for me" ausgewählt. Geben Sie als Id "AnimalTracker" ein und klicken Sie auf Add um das neue Katalog-Objekt zu erstellen. Das Katalog-Symbol ähnelt dem eines Ordners mit einer kleinen Lupe darin. Wählen Sie das Symbol AnimalTracker um die Ansicht Contents auf dem Bildschirm anzuzeigen. Ein ZCatalog sieht ähnlich aus wie ein Ordner, enthält aber zusätzliche Reiter. Sechs Reiter entsprechen denen eines Ordners. ZCatalog-Objekte haben folgende Ansichten: Contents, Catalog, Properties, Indexes, MetaData, Find Objects, Advanced, Undo, Security und Ownership. Wenn man ein ZCatalog-Objekt anklickt, wird zuerst die Contents-Ansicht angezeigt. Man kann dort neue Objekte hinzufügen, die der ZCatalog wie ein normaler Ordner beherbergt. Objekte, die sich im Katalog befinden, sind aber nicht zwangsläufig über den Katalog suchbar. Den ZCatalog haben wir angelegt, bestimmen wir nun die zu katalogisierenden Objekte. Gehen wir von einer Webseite über einen Zoo mit Informationen über Tiere aus. Erstellen Sie zwei DTML-Dokumente, die Informationen über Reptilien und Amphibien beinhalten:
Besucher Ihres Zoos möchten nun nach Informationen über die Tiere suchen können. Eifrige Herpetologen möchten gerne wissen, ob im Zoo ihre Lieblings-Schlange lebt, deshalb müssen Sie eine Stichwortsuche bereitstellen, die alle Dokumente anzeigt, die die Stichworte enthalten. Die Suche nach Informationen ist eine der hauptsächlichen Web-Anwendungen. Der vorhin erstellte AnimalTracker-ZCatalog kann alle Dokumente des Zope-Webangebots katalogisieren und ermöglicht dem Benutzer eine Suche nach Stichwörtern. Wählen Sie den AnimalTracker-ZCatalog aus und klicken sie auf den Reiter Find Objects. In dieser Ansicht teilen Sie dem ZCatalog mit, welche Art von Objekten katalogisiert werden sollen. Wir wollen nun alle DTML-Dokumente katalogisieren, wählen Sie dazu DTML Document aus der Mehrfachauswahl Find objects of type und klicken Sie auf Find and Catalog. Der ZCatalog sucht nun alle DTML-Dokumente beginnend in dem Verzeichnis, in dem er selbst plaziert ist. Er durchsucht den Ordner, danach alle Unterverzeichnisse, deren Unterverzeichnisse, usw. Wenn diese viele Objekte enthalten, kann der Vorgang durchaus eine längere Zeit in Anspruch nehmen. Nach einer Zeitspanne erscheint die Catalog-Ansicht und teilt dem Anwender den Status des Katalogisierungsvorganges mit. Darunter erscheint eine Liste über die katalogisierten Objekte. Es sind ausschliesslich DTML-Dokumente. Man kann die Objekte anklicken um sich sicher zu sein, dass es die gewünschten sind. Nun haben wir den Arbeitsschritt zur Katalogisierung von Objekten beendet. Die Objekte sind in der ZCatalog-Datenbank abgelegt. Jetzt gehen wir zum dritten Arbeitsschritt über, in dem ein Suchformular und eine Ergebnisseite für den ZCatalog erstellt wird. Such- und Ergebnis-FormulareGehen Sie in das AnimalTracker-Katalogobjekt und w�hlen Sie Z Search Interface aus der Produktauswahlliste. Geben Sie den AnimalTracker-ZCatalog als suchbares Objekt an, wie es in Abbildung 9-2 gezeigt ist. Abbildung 9-2 Erstellen eines Suchformulares für einen ZCatalog Benennen Sie die Report Id "Suchergebnisse" und die Search Input Id "Suchformular" und klicken Sie dann auf Add. Dadurch werden zwei neue DTML-Methoden im ZCatalog namens Suchformular und Suchergebnisse erstellt. Diese Objekte sind zwar im ZCatalog enthalten, werden aber nicht vom ZCatalog katalogisiert. Der AnimalTracker enthält nur katalogisierte DTML-Dokumente. Die Suchformular- und Suchergebnisse-Methoden sind lediglich eine Benutzerschnittstelle für die Suche innerhalb der Dokumente mit Informationen über Tiere im Katalog. Sie können das überpüfen, indem Sie sich den Reiter Cataloged Objects ansehen. Dort werden die beiden DTML-Methoden nicht aufgeführt. Wählen Sie die Methode Suchformular und klicken Sie dort auf den Reiter View. Das Formular enthält einige Felder. Es gibt ein Suchfeld für jeden Index im ZCatalog. Indizes werden im nächsten Abschnitt beschrieben. Klicken Sie für unser Beispiel in das PrincipiaSearchSource Feld. Alle anderen Felder des Formulars können leer gelassen werden. Sie können nach Dokumenten suchen, die im ZCatalog AnimalTracker erfasst sind, indem Sie Suchwörter in das PrincipiaSearchSource Feld eingeben. Geben Sie zum Beispiel das Wort "Reptilien" ein. Der ZCatalog AnimalTracker wird durchsucht und eine einfache Tabelle ausgegeben, die alle Dokumente anzeigt, die das Wort "Reptilien" enthalten. Die Teppich-Python sollte in der Tabelle angezeigt werden. Man kann auch mehrere Wörter angeben, die Suche geht dann über alle Dokumente, die eines der Wörter enthalten, z. B. "Reptilien Amphibien". Es sollten nun die beiden Dokumente über den Vier-Augen-Frosch und die Teppich-Python angezeigt werden. Herzlichen Glückwunsch, damit haben Sie erfolgreich einen Katalog angelegt, Dokumente darin indiziert und eine Suche auf die Dokumente ausgeführt. Kataloge konfigurierenEs gibt mit ZCatalog weitaus mächtigere und komplexere Suchmöglichkeiten als wir bisher ausgeführt haben. Sehen wir uns an, wie ein Katalog seine Information abspeichert. Mit diesem Wissen kann man sich den Katalog so zurechtschneidern, dass er die Art Suche zur Verfügung stellt, die man haben möchte. Indizes definierenIn ZCatalog werden Informationen über Objekte und ihre Inhalte in schnellen Datenstrukturen, die Indizes genannt werden, gespeichert. Indizes können viele Informationen sehr schnell ablegen und wiederfinden. Man kann verschiedene Indizes definieren, die verschiedene Informationen über die Objekte enthalten können. Zum Beispiel kann ein Index den Inhalt von DTML-Dokumenten, ein anderer Objekte, die bestimmte Eigenschaften haben, einschliessen. Bei einer Suche im ZCatalog werden nicht die Inhalte der einzelnen Objekte durchsucht, das wäre bei einer grossen Anzahl von Objekten viel zu aufwändig. Vor einer Suche untersucht der ZCatalog die Objekte und sammelt genau die Informationen für die er eingerichtet ist. Diesen Vorgang nennt man indizieren. Ab diesem Zeitpunkt kann man nach bestimmten Kriterien suchen, der ZCatalog liefert genau die Objekte zurück, auf die die Kriterien zutreffen. Denken Sie an einen Index in einem Buch. Man kann in einem Buch zum Beispiel nach dem Wort Python suchen und erhält etwa folgende Angabe: Python: 23, 67, 227 Das Wort Python kommt hier auf drei Seiten vor. Ein Index in Zope arbeitet �hnlich, ausser dass er das Suchmuster - im Beispiel das Wort Python - in einer Liste von Objekten sucht anstatt auf Buchseiten. In Zope können Indizes von einem Katalog hinzugefügt und entfernt werden. Dazu kommt eine Index-Schnittstelle, die in Abbildung 9-3 gezeigt ist, zum Einsatz: Abbildung 9-3 Indizes verwalten ZCatalog bringt bereits einige vordefinierte Indizes mit. Jeder Index hat einen Namen (z. B. PrincipiaSearchSource) und einen Typ (z. B. TextIndex). Beim Katalogisieren eines Objektes wird mit Hilfe jedes Index' das Objekt untersucht. Der Katalog sieht in Attributen und Methoden nach, um den Wert eines Objekts für jeden Index zu ermitteln. Bei DTML-Dokumenten wird zum Beispiel beim Katalogisieren mit einem PrincipiaSearchSource- Index die Methode PrincipiaSearchSource des Dokuments aufgerufen. Der Katalog speichert deren Ergebnisse in seinem PrincipiaSearchSource-Index ab. Wenn der Katalog in dem Objekt keine passende Methode finden kann, wird das Objekt ignoriert. Das Objekt wird also nicht im Index abgelegt. Es gibt vier Index-Arten:
Auf die verschiedenen Indix-Typen wird weiter hinten in diesem Kapitel näher eingegangen. Auf der Indexes-Ansicht eines ZCatalogs können neue Indizes angelegt werden. Zunächst wählt man in dem Auswahlfeld einen Index-Typ aus und klickt auf Add, falls der Browser nicht bereits von selbst das Erstellungs-Formular anzeigt. Danach füllt man das Feld Id aus und klickt auf Add. Man erhält einen neuen leeren Index in dem ZCatalog. Um diesen mit Informationen muss man den Indizierungsvorgang erneut ausführen. Dies erreicht man indem man auf die Schaltfläche Update Catalog in der Ansicht Advanced des ZCatalogs klickt. Der Vorgang kann eine Weile dauern, wenn man viele Objekte hat. Einen Index kann man aus dem Katalog auch wieder entfernen, indem man das Kontrollkästchen links neben dem Namen des Index aktiviert und auf Remove Index klickt. Es werden sowohl der Index als auch sein Inhalt entfernt. Der Vorgang kann mit Undo auch wieder zurückgenommen werden. Metadaten definierenEin ZCatalog kann nicht nur Informationen über Objekte indizieren sondern auch in einer tabellarischen Datenbank genannt Metadaten-Tabelle abspeichern. Die Metadaten-Tabelle funktioniert ähnlich wie eine Tabelle in einer relationalen Datenbank. Sie besteht aus einer oder mehreren Spalten, die das Schema der Tabelle definieren. Die Tabelle ist mit Zeilen gefüllt, die Informationen über die katalogisierten Objekte enthalten können. Die Metadaten-Spalten müssen nicht zwingend Indizes im Katalog entsprechen. Mit Indizes kann man suchen, Metadaten ermöglichen einen Bericht über die Suchergebnisse. Die Metadaten-Tabelle ist für die Generierung des Berichtes über die Suchergebnisse nützlich. Sie verfolgt die Informationen über Objekte, die in den Suchberichten erscheinen. Wenn man z. B. eine Metadaten-Tabellen-Spalte namens absolute_url erstellt, können die Berichte diese Informationen benutzen um einen Link zu den gesuchten Objekten zu erzeugen. Man legt eine neue Metadaten-Tabellen-Spalte an, in dem man den Namen in der Ansicht Metadata bei Add Metadata einträgt und auf die Schaltfläche Add klickt. Um eine Spalte zu entfernen, wählt man das Kontrollkästchen beim Spaltennamen an und klickt dann auf die Schaltfläche Delete. Die Spalte und ihr Inhalt in jeder Zeile werden entfernt. Die Funktion kann mit der Undo-Funktion rückgängig gemacht werden. Sehen wir uns nun die Suche im Katalog etwas genauer an. Suche im KatalogMan kann einen Katalog durchsuchen, in dem man ihm einen Suchtext übergibt. Dieser Suchtext beschreibt, nach was man in einem oder mehreren Indizes suchen möchte. Der Katalog kann diese Information aus der Web-Anfrage entnehmen, es ist aber auch eine Übergabe aus einem DTML- oder Python-Script denkbar. Der Katalog antwortet auf die Anfrage mit einer Liste von Einträgen, die zu den katalogisierten Objekten gehören, auf die die Suchanfrage passt. Suchen mit FormularenIn diesem Kapitel verwendeten wir das Z Search Interface um automatisch ein Such- und Antwort-Formular zu erstellen, mit dem man im Katalog suchen kann (die Zusammenhänge zwischen Formular und Action wurden bereits in Kapitel 4 "Dynamischer Inhalt mit DTML" behandelt). Das Z Search Interface generiert ein sehr einfaches Suchformular und einen sehr einfachen Bericht. Mit diesen beiden Methoden kann man die Funktionsweise des Katalogs und Anpassungsmöglichkeiten der Suchschnittstelle kennenlernen. Im weiteren behandeln wir einen Katalog, der News-Einträge enthält. Jeder News-Eintrag hat einen Inhalt, einen Autor und ein Erstellungsdatum. Der Katalog verfügt über drei Indizes, jeweils einen für jedes dieser Attribute. Der Inhalts-Index ist ein Text-Index, für Autor und Datum wird ein Feld-Index verwendet. Mit folgendem Suchformular kann man Anfragen an den Katalog stellen: Dieses Formular besteht aus drei Eingabefeldern namens inhalt, autor und datum. Die Benennungen müssen zu den Namen der Indizes im Katalog passen. Folgender Bericht liefert das Ergebnis zu der Suche: Einige Punkte müssen wir näher betrachten. Das Herz des Berichts ist das Tag in: Dieses Tag ruft den Katalog NewsCatalog auf. Beachten Sie, dass nicht alle Parameter aus dem Suchformular (Inhalt, Autor, Datum) im Ergebnis-Bericht auftauchen. Zope stellt automatisch sicher, dass die Parameter aus dem Suchformular dem Katalog übergeben werden. Man muss lediglich selbst dafür sorgen, dass der Ergebnis-Bericht den Katalog aufruft. Zope entnimmt die Suchwörter der Web-Anfrage und reicht sie an den Katalog weiter. Der Katalog liefert eine Folge von Datensatz-Objekten (ähnlich wie ZSQL-Methoden) zurück. Diese Datensatz-Objekte passen zu den Treffern der Suche, also den Objekten die zu den von Ihnen eingegebenen Kriterien passen. Damit ein Datensatz in einer Suche gefunden wird, muss er zu allen Kriterien jedes einzelnen Index passen. Wenn man also einen Autor und ein paar Suchworte für den Inhalt angibt, liefert der Katalog nur die Datensätze zurück, die sowohl zu dem Autor als auch zum Inhalt passen. Datensatz-Objekte haben ein Attribut für jede Spalte in einer Datenbank-Tabelle. Katalog-Datensatz-Objekte aarbeiten ähnlich, außer, dass sie ein Attribut für jede Spalte der Metadaten-Tabelle enthalten. In Wirklichheit ist der Zweck der Metadatentabelle die Definition eines Schemas für die Datensatzobjekte, die Anfragen im Katalog zurückliefern. Suchanfragen mit PythonMit DTML lassen sich von Suchformularen leicht Anfragen an einen Katalog realisieren. DTML stellt sicher, dass die Suchparameter an den Katalog korrekt weitergeleitet werden. Manchmal möchte man einen Katalog nicht von einem Web-Formular aus durchsuchen; stattdessen soll an einer Stelle ein anderes Programmmodul eine Anfrage an den Katalog stellen. Nehmen wir zum Beispiel an, dass im Zope Zoo ein Informationsbalken angebracht werden soll, der nur die News-Einträge anzeigt, die zu den gerade angezeigten Tieren gehören. Wie früher bereits beschrieben, baut der Zope Zoo auf Ordner auf, die passend zu den Tierarten aufgeteilt sind. Jede Ordner-ID bezeichnet die Tierart, die sich in dem Ordner befindet. Der In unserem Beispiel sollen alle News-Einträge angezeigt werden, die die ID des aktuellen Ordners enthalten. Das folgende Skript namens relevanteSektionsNachrichten stellt Suchanfragen an den NewsCatalog mit der aktuellen Ordner-Id: ## Script (Python) "relevanteSektionsNachrichten" ## """ Liefert Nachrichten, die für die aktuelle Ordner-Id relevant sind. """ id=context.getId() return context.NewsCatalog({'Inhalt' : id}) Das Skript stellt Anfragen an den NewsCatalog, indem es ihn wie eine Methode aufruft. Kataloge erwarten eine Zuordnung (mapping) als erstes Argument, wenn sie aufgerufen werden. Das Argument ordnet den Namen eines Index einem Such-Objekt zu. In diesem Fall wird im Index Inhalt nach allen Neuigkeiten-Einträgen gesucht, die den Namen es aktuellen Ordners enthalten. Um das Skript in dem Informationsbalken einzubinden, muss das standard_html_header-Objekt im Zope-Zoo wie folgt angepasst werden: Diese Methode geht davon aus, dass absolute_url und title als Metadaten-Spalten im NewsCatalog definiert sind. Der Informationsbalken an der Seite zeigt nun eine einfache Liste von Neuigkeiten-Einträgen anzeigen, die die Id des aktuell angezeiten Ordners enthalten. Einzelheiten beim Suchen und IndexierenZuvor haben Sie gesehen, dass der Katalog drei Indexarten unterstützt: Text-Indizes, Feld-Indizes und Schlagwort-Indizes. Wir wollen diese Indizes näher untersuchen, um zu verstehen, wofür sie gut sind und wie sie abfragbar sind. Text-Indizes durchsuchenEin Text-Index wird zum Indexieren von Texten genutzt. Nach dem Indexieren können Sie den Index nach Objekten durchsuchen, die bestimmte Wörter enthalten. Text-Indizes unterstützen eine reichhaltige Grammatik, mit der fortgeschritteneres Suchen als nur nach einem Wort möglich ist. Der Text-Index von ZCatalog kann:
Diese fortschrittlichen Leistungsmerkmale können gemischt werden. Zum Beispiel liefert "((Robert AND Onkel) AND NOT Zoo*)" alle Objekte, die die Wörter "Robert" und "Onkel", aber nicht Wörter enthalten, die mit "Zoo" beginnen wie "Zoologe", "Zoologie" und "Zoo" selbst. Das Abfragen eines Text-Indexes mit diesen fortschrittlichen Leistungsmerkmalen geschieht genauso wie mit den originalen einfachen Möglichkeiten. In ein HTML- Suchformular für DTML-Dokumente geben Sie z. B. "Koala AND Löwe" ein, und Sie erhalten alle Dokumente, in denen die Wörter Koala und Löwe vorkommen. Abfragen auf einen TextIndex arbeiten von Python aus �hnlich. Angenommen, Ihr Skript relevanteSektionsNachrichten soll keine Nachrichten bereitstellen, die das Wort "katastrophal" enthalten: ## Script (Python) "relevanteSektionsNachrichten" ## """ Liefert relevante, nicht-katastrophale Nachrichten """" id=context.getId() return context.NewsCatalog( {'Inhalt' : id + ' AND NOT katastrophal'} ) Text-Indizes sind sehr mächtig. Wenn sie mit den später in diesem Kapitel beschriebenen Automatischen Katalogisierungsmustern kombiniert werden, erhalten sie die Möglichkeit einer automatischen Volltextsuche aller Ihrer Objekte, wenn Sie sie anlegen und editieren. VokabulareVokabulare werden von Text-Indizes benutzt. Ein Vokabular ist ein Objekt, das sprachspezifische Text-Indexierungsmöglichkeiten verwaltet. Damit der ZCatalog mit jeder Sprache arbeiten kann, muss er das Verhalten dieser Sprache kennen. Zum Beispiel gilt für alle Sprachen:
Vorhandene VokabulareF�r den ZCatalog sind zur Zeit verf�gbar:
Hinter den Vokabularen steckt die Idee, die Indexierung von Texten auf jede Sprache anpassen zu können. Daher können in Zukunft möglicherweise andere Sprachen unterstützt werden, wenn jemand ein Vokabular für diese Sprache erstellt. Das Erstellen eines eigenen Vokabulars ist ein Fortgeschrittenen-Thema und geht über den Themenkreis dieses Buchs hinaus. Vokabulare benutzenWenn Sie einen neuen ZCatalog erstellen, enthält das ZCatalog-Anlegeformular einen Auswahlkasten, mit dem Sie das Vokabular auswählen. Wenn Sie kein Vokabular auswählen, erzeugt ZCatalog automatisch ein flaches Vokabular und fügt es zum ZCatalog-Inhalt (dies können Sie in der Ansicht Contents des AnimalTracker sehen, der von Ihnen für die Beispiele in diesem Kapitel erzeugt wurde). Um ein geklumptes Vokabular oder irgendein anderes Vokabular zu benutzen, muss es von Ihnen erzeugt werden, bevor der Katalog angelegt wird, der es benutzen soll. Ein ZCatalog kann jedes Vokabular benutzen, das zu seinem Inhalt gehört, oder jedes Vokabular, das er in der Zope-Ordner-Hierarchie �ber sich finden kann. Suchen in Feld-IndizesFeld-Indizes unterscheiden sich geringfügig von Text-Indizes. Ein Text-Index benutzt den Wert, den er in Ihrem Objekt findet, z. B. den Text einer Nachrichteneinheit. Das heißt, er teilt den Text in einzelne Wörter und indexiert alle einzelnen Wörter. Ein Feld-Index teilt demgegen�ber den gefundenen Wert nicht auf. Er indexiert den gesamten gefundenen Wert. Dies ist n�tzlich f�r Objekte, denen bestimmte Eigenschaften zugeordnet sind. In dem Nachrichtenbeispiel erzeugten Sie zwei Feld-Indizes, Datum und Autor. Mit dem bestehenden Suchformular sind diese Felder nicht besonders n�tzlich. Um sie effektiver zu nutzen, m�ssen Sie das Suchformular etwas �ndern. Bevor Sie dies tun, wollen wir einige Anwendungsf�lle f�r diese Indizes betrachten. Der Datum-Index ermöglicht die Suche nach Nachrichten anhand des Zeitpunkts, an dem sie angelegt wurden. Das vorhandene Suchformular ist nicht nützlich, da es als Eingabe die bis auf die Sekunde genaue Zeitangabe verlangt, um bei der Suche Ergebnisse zu erhalten. Das ist offensichtlich nicht sehr nützlich. Besser würde die Suche nach einem Zeitraum sein, wie z. B. nach Nachrichten, die in den letzten 24 Stunden oder im letzten Monat hinzugefügt wurden. Der Autor-Index ermöglicht die Suche nach Nachrichten von bestimmten Autoren. Allerdings müssen Sie die genaue Schreibweise des Autorennamens kennen. Daher würde es besser sein, wenn Sie die Auswahl aus einer Liste aller vertretenen Autoren treffen können. Feld-Indizes sind dafür bestimmt, das Suchen in beiden Fällen zu erleichtern: die Suche innerhalb eines Bereichs und die Suche aufgrund im Index gespeicherter Werte. Um hiervon Gebrauch zu machen, müssen Sie das Suchformular nur ein wenig ändern. Versuchen wir als erstes Beispiel die Suche mit einem Zeitraum. Ähnlich wie Text-Indizes können den Feld-Indizes spezielle Optionen mitgeteilt werden, mit denen dann diese Leistungsmerkmale bereitgestellt werden können. Sie sind als Formularteile aufzunehmen, damit sie zu Katalog-Abfragen umgesetzt werden. Hier nehmen wir das Suchformular, das im vorigen Abschnitt Suchen mit Formularen benutzt wurde, und ergänzen es mit einem Formularteil, mit dem die Suche nach Nachrichten seit "gestern". "letzter Woche", "letztem Monat", "letztem Jahr" oder "irgendwann" ermöglicht wird: Dadurch sollte das Suchformular wie Abbildung 9-4 aussehen. Abbildung 9-4 Suche nach einem Zeitraum Dieses HTML-Formular �ndert das Datum-Format aus dem alten Suchformular. Anstatt eines einfachen Textkastens bietet es einen Auswahlkasten, mit dem Sie das Datum ausw�hlen k�nnen. Aber Achtung: es handelt sich um eine Zeitraum-Suche. K�nnen Sie die Stelle finden, mit der dem Datum-Feld-Index gesagt wird, nach einen Bereich zu suchen? Hier ist sie: Hierbei handelt es sich um ein spezielles HTML-Formularelement, das verstecktes Element genannt wird. Es erscheint nicht auf dem Formular, wird aber trotzdem an Zope gesandt, wenn Sie die das Formular abschicken. Dieses spezielle Element - hier Datum_usage genannt - informiert den Feld-Index, dass der Wert im Datum-Formularelement als untere Bereichsgrenze zu verwenden ist. D.h., der Feld-Index gibt nicht nur die Objekte zurück, die genau diese Zeitangabe haben, sondern auch diejenigen Objekte mit jedem danach liegenden Datum. Für jede Feldindex-Art gibt es Begriffe für die Bereichsnutzung. Hierfür wird ein zusätzliches Suchargument benutzt, bei dem der Name des Indizes mit der Endung "_usage" ergänzt wird. Anstelle der Untergrenze können Sie auch eine Obergrenze bestimmen; das versteckte Formularelement ist dann wie folgt zu ändern: Diese Anweisung veranlasst das Suchformular, alle Nachrichten vor einem bestimmten Zeitpunkt statt nach ihm bereitzustellen. Die "_usage"-Syntax kann auch benutzt werden, wenn der Katalog von einem Skript wie hier von relevanteKuerzlicheSektionsNachrichten aufgerufen wird: ## Script (Python) "relevanteKuerzlicheSektionsNachrichten" ## """ Liefert relevante, kürzlich hinzugefügt Nachrichten """ id=context.getId() return context.NewsCatalog( {'Inhalt' : id, 'Datum' : ZopeTime() - 7, 'Datum_usage' : 'range:min', } ) Dieses Skript arbeitet wie das alte relevanteSektionsNachrichten Skript, allerdings zeigt es nur die in der letzten Woche hinzugefügten Nachrichten. Sie können gleichzeitig die untere und obere Bereichsgrenze zur Suche verwenden. Hierbei ist aber etwas zu beachten. Normalerweise benutzt ZCatalog den übergebenen Wert als Suchbegriff, wenn überhaupt kein Bereich oder wenn nur ein Grenzwert angegeben ist. Wenn Sie zwei Bereichsgrenzen angeben, benötigt der ZCatalog auch zwei Suchwerte, nicht nur einen. Hier ist das relevanteKuerzlicheSektionsNachrichten Skript von oben mit einer geringfügigen Änderung, die eine Liste von Datumsobjekten statt eines einzelnen Datumswertes in das Skript einbaut: ## Script (Python) "relevanteKuerzlicheSektionsNachrichten" ## """ Liefert relevante Nachrichten, die im letzten Monat, aber nicht in der letzten Woche bearbeitet worden sind. """ id=context.getId() return context.NewsCatalog( {'Inhalt' : id, 'Datum' : [ZopeTime() - 30, ZopeTime() - 7], 'Datum_usage' : 'range:min:max', } ) Dieses Skript gibt alle relevanten Nachrichten zurück, die im letzten Monat, aber nicht in der letzten Woche, geändert worden sind. Wenn zwei Grenzwerte benutzt werden, ist es wichtig, darauf zu achten, dass die Reihenfolge der Werte mit der Reihenfolge der Bereichsbegriffe übereinstimmt. Wenn Sie zufällig die Begriffe "min" und "max" vertauschen, aber nicht gleichzeitig die beiden Zeitangaben, dann werden Sie keine Suchergebnisse erhalten, da Sie eine Abfrage gestellt haben, die keinen Sinn macht (durch Lieferung eines Minimalwertes, der größer ist als der angegebene Maximalwert). Der zweite Anwendungsfall, den wir oben beschrieben, betraf die Suche anhand einer Liste der im Katalog enthaltenen Autoren. Die hierfür in ZCatalog vorgesehene spezielle Methode heißt uniqueValuesFor. Die Methode uniqueValuesFor gibt eine Liste von Werten eines bestimmten Indizes zurück, wobei jeder Wert nur einmal in der Liste vorkommt, auch wenn hierzu mehrere Einträge im Katalog vorhanden sind. Lassen Sie uns das Suchformular nochmals ändern, und ersetzen wir den originalen Eingabekasten Autor mit etwas Nützlicherem: Das neue wichtige Code-Stück, das dem Suchformular hinzugefügt worden ist, lautet: Weiter ist das HTML ein bisschen geändert worden, damit die Bildschirmanzeige Sinn macht. In diesem Beispiel haben wir das Formularelement Autor von einem einfachen Textkasten in einen HTML-Mehrfach-Auswahl-Kasten ge�ndert. Dieser Kasten enth�lt eine Liste mit den Autoren, die im Autor-Feldindex enthalten sind. Nun sieht das Suchformular wie in Abbildung 9-5 aus. Abbildung 9-5 Bereichssuche und vorgegebene Autoren Das war's. Sie können dieses Suchformular um weitere HTML-Formularelemente ergänzen und die Suche damit so komplex machen, wie Sie es möchten. Im nächsten Abschnitt werden wir zeigen, wie Sie die weitere Indexart, die Schlagwort-Indizes benutzen können. Suchen mit Schlagwort-IndizesEin Schlagwort-Index nimmt eine Folge der Schlagwörter von Objekten auf und kann nach Objekten durchsucht werden, die ein Schlagwort oder mehrere Schlagwörter besitzen. Nehmen wir an, Sie haben eine Reihe von Bild-(Image-)Objekten, denen eine Eigenschaft Thema zugeordnet ist. Die Eigenschaft Themen ist eine Zeileneigenschaft, die die relevanten Themen für ein bestimmtes Bild auflistet, z. B. für ein Bild der Königin Victoria "Portrait", "19. Jahrhundert" und "Frau". Die Themen ermöglichen die Kategorisierung von Bildern. Jedes Bild gehört zu einer oder zu mehreren Kategorien, je nachdem, was in seiner Eigenschaft Themen eingetragen ist. So gehört das Bild der Königin Victoria in dem oben aufgeführten Beispiel zu drei Kategorien und kann daher gefunden werden, wenn nach einem dieser drei Begriffe gesucht wird. Sie können einen Schlagwort-Index für die Suche nach der Eigenschaft Themen benutzen. Hierfür definieren Sie einen Schlagwort-Index mit dem Namen Themen in Ihrem ZCatalog. Dann katalogisieren Sie Ihre Bilder. Danach sollten Sie in der Lage sein, alle Portraits mit Hilfe eines Suchformulars und dem Eintrag "Portrait" im Feld Themen zu finden. Sie können auch alle Bilder im Zusammenhang mit dem 19. Jahrhundert finden, wenn Sie bei der Suche "19. Jahrhundert" eingeben. Wichtig ist hierbei, dass dasselbe Bild mehr als einer Kategorie zugeordnet sein kann. Dies ermöglicht eine höhere Flexibilität für die Suche und die Kategorisierung Ihrer Objekte als beim Feld-Index. Ihr Portrait von Königin Victoria könnte in einem Feld-Index nur mit einer einzigen Art kategorisiert werden. Mit einem Schlagwort-Index kann es auf verschiedene Arten kategorisiert werden. Häufig werden Sie nur eine kleine Liste mit Schlagwörtern für einen Schlagwort-Index haben. In diesem Fall werden Sie es vorziehen, mit der uniqueValuesFor-Methode ein angepasstes Suchformular zu verwenden. Zum Beispiel ist hier ein Ausschnitt mit DTML-Anweisungen, mit denen ein Mehrfach-Auswahl-Kasten für alle Werte aus dem Thema-Index erzeugt wird: Mit diesem Suchformular werden dem Benutzer eine Reihe g�ltiger Suchbegriffe vorgegeben. Sie k�nnen mehrere Themen ausw�hlen, und Zope wird alle Bilder finden, die zu einem oder mehreren Themen geh�ren, die Sie ausgew�hlt haben. Nicht nur jedes Objekt kann mehreren verschiedenen indexierten Themen zugeordnet sein, sondern Sie k�nnen auch mehrere Themen als Suchbegriff angeben und damit alle Objekte finden, denen eine oder mehrere dieser Angaben zugeordnet sind. Suchen in Pfad-IndizesPfad-Indizes ermöglichen die Suche nach Objekten aufgrund ihrer Anordnung in Zope. Angenommen, sie haben ein Objekt mit dem Pfad Wenn Sie zusammengehörende Objekte in demselben Ordner anordnen, können Sie die Pfad-Indizes benutzen, um diese Objekte schnell aufzusuchen. Zum Beispiel:
Diese Abfrage sucht einen Katalog nach allen Bildern durch, die im Abhängig davon, wie Sie Ihre Objekte in Ihrer Site anordnen, können die Pfad-Indizes mehr oder weniger nützlich sein. Wenn Sie die Objekte unabhängig von ihrem Thema plazieren (z. B., Sie legen sie in der Regel in persönlichen "home"-Ordnern an), sind Pfad-Indizes nur von begrenztem Wert. In diesem Fall sind Schlagwort- und Feld-Indizes nützlicher. Advanced Searching with RecordsA new feature in Zope 2.4 is the ability to query indexes more precisely using record objects. Record objects contain information about how to query an index. Records are Python objects with attributes, or mappings. Different indexes support different record attributes. Keyword Index Record Attributes
For example: # big or shiny results=Catalog(categories=['big, 'shiny']) # big and shiny results=Catalog(categories={'query':['big','shiny'], 'operator':'and'}) The second query matches objects that have both the keywords "big" and "shiny". Without using the record syntax you can only match objects that are big or shiny. Field Index Record Attributes
For example: # items modified in the last week results=Catalog(bobobase_modification_time={ 'query':DateTime() - 7, 'range': 'min'} ) This query matches objects with a Text Index Record Attributes
There's not much reason to use record queries with text indexes since you can embed the operator information in the query string itself in a very flexible manner. Path Index Record Attributes
Suppose you have a collection of objects with these paths:
Here are some examples queries and their results to show how the
You can use the level attribute to flexibly search different parts of the path. As of Zope 2.4.1, you can also include level information in a search without using a record. Simply use a tuple containing the query and the level. Here's an example tuple: Creating Records in HTMLYou can also perform record queries using HTML forms. Here's an example showing how to create a search form using records: For more information on creating records in HTML see the section "Passing Parameters to Scripts" in Chapter 10, Advanced Zope Scripting. Stored QueriesWhile the main use of the Catalog is to provide interactive searching, you can also use stored queries to categorize and organize your site. For example, in the section on keyword indexes you saw how you can use the Catalog and properties to search for categories of Images such as portraits. In addition to providing interactive searching for categories of Images you can create web pages with canned queries. So for example, here's some DTML that you could use for a page that displays all your portraits:
The dynamic nature of this page is not visible to the viewer. However, just add another portrait, update the catalog and this page will automatically include the new Image. This technique can be very powerful. Not only can you organize and display public resources, but you can easily institute workflow systems by tagging objects with properties to indicate their state and cataloging them. After that it's easy for you to create pages for different people that show which objects need their attention. This technique is even more powerful when using the Automatic Cataloging pattern. Automatisches KatalogisierenAutomatisches Katalogisieren ist ein fortgeschrittenes Verwendungsmuster des ZCatalogs, der Objekte aktuell h�lt, falls sie ge�ndert wurden. Wenn Objekte erstellt, ge�ndert oder gel�scht werden, muss das automatisch von einem ZCatalog verfolgt werden. Dies setzt voraus, dass die Objekte den Katalog benachrichtigen, wenn sie erstellt, ge�ndert oder gel�scht wurden. Das hat eine Reihe von Vorteilen gegen�ber der Massenkatalogisierung. Massenkatalogisierung ist einfach, hat aber Nachteile. Die Gesamtmenge von Inhalten, die Sie in einer Transaktion indexieren k�nnen, ist �quivalent zum Speicher, der f�r den Zope Prozess, plus dem tempor�rer Speicher zur Verf�gung steht, den das System ben�tigt. Mit anderen Worten, je mehr sie in einem Zug indexieren wollen, desto leistungsf�higer muss Ihre Computerhardware sein. Massenkatalogisierung ist gut bis zu einigen tausend Objekten, aber dar�ber hinaus funktioniert die automatische Indexierung viel besser. Ein anderer wichtiger Vorteil des automatischen Katalogisierens ist, dass es Objekte verwalten kann, die sich �ndern. Wenn Objekte entstehen und sich �ndern, ist die Indexinformation immer aktuell, sogar f�r sich rasch �ndernde Informationsquellen wie Nachrichtenbretter (message boards). In diesem Abschnitt erl�utern wir Ihnen ein Beispiel, in dem Nachrichten- (News) Elemente erstellt werden, die Autoren Ihrer Site hinzuf�gen k�nnen. Diese Elemente werden automatisch katalogisiert. Das Beispiel gliedert sich in zwei Teile:
As of Zope 2.3, none of the "out-of-the-box" Zope objects support automatic cataloging. This is for backwards compatibility reasons. For now, you have to define your own kind of objects that can be cataloged automatically. One of the ways this can be done is by defining a ZClass. A ZClass is a Zope object that defines new types of Zope objects. In a way, a ZClass is like a blueprint that describes how new Zope objects are built. Consider a news item as discussed in examples earlier in the chapter. News items not only have content, but they also have specific properties that make them news items. Often these Items come in collections that have their own properties. You want to build a News site that collects News Items, reviews them, and posts them online to a web site where readers can read them. In this kind of system, you may want to create a new type of object called a News Item. This way, when you want to add a new news item to your site, you just select it from the product add list. If you design this object to be automatically cataloged, then you can search your news content very powerfully. In this example, you will just skim a little over ZClasses, which are described in much more detail in Chapter 14, "Extending Zope." New types of objects are defined in the Products section of the Control Panel. This is reached by clicking on the Control Panel and then clicking on Product Management. Products contain new kinds of ZClasses. On this screen, click "Add" to add a New product. You will be taken to the Add form for new Products. Name the new Product "News" and click "Generate". This will take you back to the Products Management view and you will see your new Product. Select the News Product by clicking on it. This new Product looks a lot like a Folder. It contains one object called Help and has an Add menu, as well as the usual Folder "tabs" across the top. To add a new ZClass, pull down the Add menu and select ZClass. This will take you to the ZClass add form, as shown in Figure 9-6. Figure 9-6 ZClass add form This is a complicated form which will be explained in much more detail in Chapter 14, "Extending Zope". For now, you only need to do three things to create your ZClass:
When you're done, don't change any of the other settings in the Form. To create your new ZClass, click Add. This will take you back to your News Product. Notice that there is now a new object called NewsItem as well as several other objects. The NewsItem object is your new ZClass. The other objects are "helpers" that you will examine more in Chapter 14, "Extending Zope". Select the NewsItem ZClass object. Your view should now look like Figure 9-7. Figure 9-7 A ZClass Methods View This is the Methods View of a ZClass. Here, you can add Zope objects that will act as methods on your new type of object. Here, for example, you can create DTML Methods or Scripts and these objects will become methods on any new News Items that are created. Before creating any methods however, let's review the needs of this new "News Item" object:
You may want your new News Item object to have other properties, these are just suggestions. To add new properties to your News Item click on the Property Sheets tab. This takes you to the Property Sheets view. Properties are added to new types of objects in groups called Property Sheets. Since your object has no property sheets defined, this view is empty. To add a New Property Sheet, click Add Common Instance Property Sheet, and give the sheet the name "News". Now click Add. This will add a new Property Sheet called News to your object. Clicking on the new Property Sheet will take you to the Properties view of the News Property Sheet, as shown in Figure 9-8. Figure 9-8 The properties screen for a Property Sheet This view is almost identical to the Properties view found on Folders and other objects. Here, you can create the properties of your News Item object. Create three new properties in this form:
That's it! Now you have created a Property Sheet that describes your News Items and what kind of information they contain. Properties can be thought of as the data that an object contains. Now that we have the data all set, you need to create an interface to your new kind of objects. This is done by creating new Views for your object. Click on the Views tab. This will take you to the Views view, as shown in Figure 9-9. Figure 9-9 The Views view Here, you can see that Zope has created three default Views for you. These views will be described in much more detail in Chapter 14, "Extending Zope", but for now, it suffices to say that these views define the tabs that your objects will eventually have. To create a new view, use the form at the bottom of the Views view. Create a new View with the name "News" and select "propertysheets/News/manage" from the select box and click Add. This will create a new View on this screen under the original three Views, as shown in Figure 9-10. Figure 9-10 The new News View Since this View is going to give us the ability to edit the News Item, we want to make it the first view that you see when you select a News Item object. To change the order of the views, select the newly created News view and click the First button. This should move the new view from the bottom to the top of the list. The final step in creating a ZClass is defining the methods for the class. Methods are defined on the Methods View. Click on the Methods tab and you will be taken to the Methods view. Select 'DTML Method' from the add list and add a new DTML Method with the id "index_html". This will be the default view of your news item. Add the following DTML to the new method:
That's it! You've created your own kind of object called a News Item. When you go to the root folder, you will now see a new entry in your add list. But don't add any new News Items yet, because the second step in this exercise is to create a Catalog that will catalog your new News Items. Go to the root folder and create a new catalog with the id Catalog. Like the previous two examples of using a ZCatalog, you need to create Indexes and a Meta-Data Table that make sense for your objects. First, delete the default indexes in the new ZCatalog and create the following indexes to replace them:
After creating these Indexes, delete the default Meta-Data columns and add these columns to replace them:
After creating the Indexes and Meta-Data Table columns, create a search interface for the Catalog using the Z Search Interface tool described previously in this chapter. Now you are ready to go. Start by adding some new News Items to your Zope. Go anywhere in Zope and select News Item from the add list. This will take you to the add Form for News items. Give your new News Item the id "KoalaGivesBirth" and click Add. This will create a new News Item. Select the new News Item. Notice how it has four tabs that match the four Views that were in the ZClass. The first View is News, this view corresponds to the News Property Sheet you created in the News Item ZClass. Enter your news in the contents box: Today, Bob the Koala bear gave birth to little baby Jimbo. Enter your name in the Author box, and today's date in the Date box. Click Change and your News Item should now contain some news. Because the News Item object is CatalogAware, it is automatically cataloged when it is changed or added. Verify this by looking at the Cataloged Objects tab of the ZCatalog you created for this example. The News Item you added is the only object that is cataloged. As you add more News Items to your site, they will automatically get cataloged here. Add a few more items, and then experiment with searching the ZCatalog. For example, if you search for "Koala" you should get back the KoalaGivesBirth News Item. At this point you may want to use some of the more advanced search forms that you created earlier in the chapter. You can see for example that as you add new News Items with new authors, the authors select list on the search form changes to include the new information. ConclusionThe cataloging features of ZCatalog allow you to search your objects for certain attributes very quickly. This can be very useful for sites with lots of content that many people need to be able to search in an efficient manner. Searching the ZCatalog works a lot like searching a relational database, except that the searching is more object-oriented. Not all data models are object-oriented however, so in some cases you will want to use the ZCatalog, but in other cases you may want to use a relational database. The next chapter goes into more details about how Zope works with relational databases, and how you can use relational data as objects in Zope. |