2009-07-06 10 views
4

Ich habe einen Suchindex mit der PHP Zend Framework Search (basierend auf Lucene) erstellt. Die Suche ist für eine Kauf/Verkaufswebsite.Wie man die Suche nach bestimmten Feldern ausklammert mit Zend Search (Lucene)

Mein Suchindex enthält die folgenden Felder:

item-id (UnIndexed)
Artikel-Titel (Text)
Artikel-Beschreibung (UnStored)
item-Tags (Text)
item- Preis (Stichwort)
Verkäufer-ID (UnIndexed)
Verkäufer-Namen (Text)

ich möchte der Benutzer die ind suchen B. ihre Suche filtern, indem sie entweder nur nach Artikeln suchen oder nach Verkäufern nach Namen suchen.

Wenn ich eine Suche mit den Standardeinstellungen von Lucene durchführe, durchsuche ich alle 5 Artikelfelder und das Feld Verkäufername. Das ist nicht das, was ich will. Was ich möchte, ist, wenn der Benutzer die Suche durchführt, die er benötigt, um aus einem Dropdown-Menü auszuwählen, wenn sie nach einem Artikel oder nach einem Verkäufer-Namen suchen.

Wie kann ich die Suchanfrage angeben, wenn ich nach Artikeln suche, die das Feld "Verkäufer" ignorieren? Und wenn ich nach Verkäufer-Namen suche, wie kann ich der Suchabfrage sagen, nicht über irgendwelchen der Artikelfelder zu suchen? Oder ist es besser, einen separaten Index für die Namen der Verkäufer zu erstellen?

Antwort

6

Es gibt derzeit keine Möglichkeit, explizit nicht ein Feld in Lucenes Abfragesprache oder die Zend_Search_Lucene Query Construction API zu suchen.

Sie können jedoch explizit angeben, welche Felder Sie in einer Abfrage suchen möchten. Ein Beispiel wäre:

seller-name: Joe McBob 

Wenn dieser Ansatz verwendet, müssen Sie explizit aufzulisten, welche Felder Sie abfragen wollen, und was in ihnen zu suchen. Wenn Sie also Ihr item-title Feld mit demselben Text durchsuchen müssen, müssten Sie das oben genannte, aber mit dem anderen Feldnamen kopieren. Ein Beispiel wäre:

seller-name: Joe McBob OR item-title: JoeMcBob 

Sie können natürlich tun dies alles durch die Erstellung von Abfragen API, die Zend_Search_Lucene sowie zur Verfügung stellt. Die manual hat dort einige gute Beispiele.

Eine Sache, die hier bemerkenswert ist, ist, dass, wie Sie herausgefunden haben, Zend_Search_Lucene ALLE Felder standardmäßig suchen wird. Dies ist eine der Arten, in der es sich von Java Lucene unterscheidet. Sie können jedoch ein Standardfeld für die Abfrage festlegen, indem Sie die statische Methode setDefaultSearchField der Klasse Zend_Search_Lucene verwenden.

+0

Danke jason. Ich habe mir gedacht, dass ich das tun muss. Ich wollte die Wissensdatenbank hier überprüfen, um zu sehen, ob es eine bessere Lösung gibt, und Sie haben meine Frage erfüllt! – justinl