2009-04-10 3 views
3

Ich arbeite an einer Store-Such-API mit Lucene.Lucene-Suchergebnisse gruppieren und Häufigkeit nach Kategorie berechnen

Ich brauche für jede Stadt, Staat Kombination mit seiner Frequenz in Klammern speichern die Suchergebnisse zeigen .... zum Beispiel:

Los Angles,CA (450) 
Atlanta,GA (212) 
Boston, MA (78) 
. 
. 
. 

Ab sofort meine Suchergebnisse zurückgeben rund 7000 Lucene Dokumente, auf Durchschnitt, wenn der Benutzer sagt "Zeige mir alle Geschäfte". In diesem Anwendungsfall zeige ich ungefähr 800 einzigartige City-, State-Records, wie oben gezeigt.

Ich bin überschreiben die Collect Methode des HitCollector Klasse und Abrufen von Vektoren wie folgt:

var vectors = _reader.GetTermFreqVectors(doc); 

Dann habe ich durch diese Auflistung durchlaufen und die Frequenz für jede einzelne Stadt berechnen, Kombination Staat.

Aber das erweist sich als sehr sehr langsam in der Leistung ... gibt es eine bessere Möglichkeit zum Gruppieren von Suchergebnissen und Berechnen der Frequenz in Lucene? Ein Code-Snippet wäre sehr hilfreich

bitte auch vorschlagen, wenn ich meine Lucene Suchcode optimieren können andere Techniken/Tipps mit ....

Danke fürs Lesen!

Antwort

3

Ich glaube nicht, Sie gerade diese OOTB in Lucene tun können - für diese Funktionalität ergibt sich ungelöstes Problem der Suche:

Jira Lucene Feature Request

Die Funktionalität vorhanden OOTB mit Solr ist jedoch - die eine Facettierung Funktion bietet . Eine Abfrage wie die folgende:

http://localhost:8983/solr/select?q=ipod&rows=0&facet=true&facet.limit=-1&facet.field=cat&facet.field=inStock

würde folgendes Ergebnis zurück:

<response> 
<responseHeader><status>0</status><QTime>2</QTime></responseHeader> 
<result numFound="4" start="0"/> 
<lst name="facet_counts"> 
<lst name="facet_queries"/> 
<lst name="facet_fields"> 
    <lst name="cat"> 
     <int name="search">0</int> 
     <int name="memory">0</int> 
     <int name="graphics">0</int> 
     <int name="card">0</int> 
     <int name="music">1</int> 
     <int name="software">0</int> 
     <int name="electronics">3</int> 
     <int name="copier">0</int> 
     <int name="multifunction">0</int> 
     <int name="camera">0</int> 
     <int name="connector">2</int> 
     <int name="hard">0</int> 
     <int name="scanner">0</int> 
     <int name="monitor">0</int> 
     <int name="drive">0</int> 
     <int name="printer">0</int> 
    </lst> 
    <lst name="inStock"> 
     <int name="false">3</int> 
     <int name="true">1</int> 
    </lst> 
</lst> 
</lst> 
</response> 

Mehr Informationen über Facettierung auf der Solr-Website:

http://wiki.apache.org/solr/SimpleFacetParameters

EDIT: Wenn Sie definitiv nicht gehen wollen SOLR aproach zu Facettierung Sie in der Lage sein können, die Funktionalität in diesem Patch für Lucene beschrieben zu nutzen:

http://sujitpal.blogspot.com/2007/01/faceted-searching-with-lucene.html

der oben auf Lucene 2.0 über einen Patch eine Implementierung der Facettierung-Funktion bietet.

+0

Können Sie bitte diese beantworten? http://stackoverflow.com/questions/899542/problem-using-same-instance-of-indexsearcher-for-multiple-requests –

0

Ich bin mir nicht sicher, ob ich verstanden habe, was Sie mit "Gruppierung" meinen, aber wenn Sie nur die Anzahl der Dokumente für jede Kategorie zählen möchten, sollten Sie einen Blick auf this question werfen.

Meine Antwort immer noch da steht, zäh niemand schien es genug zu mögen mich upvote ...

0

Steve, ich glaube, Sie wollen faceted search. Es kommt nicht mit Lucene aus der Box. Ich schlage vor, Sie versuchen mit SOLR, die faceting als eine wichtige und praktische Funktion hat.

+0

Können Sie bitte diese beantworten? http://stackoverflow.com/questions/899542/problem-verwenden-same-instance-of-indexsearcher-for-multiple-requests –