2009-03-20 4 views
6

Gibt es einen schnellen und einfachen Weg, Term-Häufigkeiten von einem Lucene-Index zu bekommen, ohne dies über die TermVectorFrequencies-Klasse zu tun, da dies für große Sammlungen sehr viel Zeit in Anspruch nimmt?Get term Frequenzen in Lucene

Was ich meine ist, gibt es etwas wie TermEnum, das nicht nur die Dokumenthäufigkeit, sondern auch die Häufigkeit des Ausdrucks hat?

UPDATE: Die Verwendung von TermDocs ist viel zu langsam.

Antwort

8

Verwenden Sie TermDocs, um die Termhäufigkeit für ein bestimmtes Dokument zu erhalten. Wie die Dokumenthäufigkeit erhalten Sie den Begriff Dokumente aus einer unter Verwendung des Begriffs von Interesse.


Sie werden keine schnellere Methode als TermDocs ohne eine gewisse Allgemeingültigkeit zu verlieren finden. TermDocs liest direkt aus der ".frq" -Datei in einem Indexsegment, in dem jede Termhäufigkeit in der Reihenfolge der Dokumente aufgeführt ist.

Wenn das "zu langsam" ist, stellen Sie sicher, dass Sie Ihren Index optimiert haben, um mehrere Segmente zu einem einzigen Segment zusammenzuführen. Iterieren Sie die Dokumente der Reihe nach (Überspringungen sind in Ordnung, aber Sie können nicht effizient in der Dokumentenliste hin und her springen).

Der nächste Schritt könnte eine zusätzliche Verarbeitung sein, um eine noch speziellere Dateistruktur zu schaffen, die die SkipData auslässt. Persönlich würde ich nach einem besseren Algorithmus suchen, um mein Ziel zu erreichen, oder bessere Hardware — viel Speicher zur Verfügung zu stellen, entweder um eine RAMDirectory zu halten, oder dem Betriebssystem für die Verwendung auf einem eigenen Datei-Caching-System zu geben.

1

TermDocs gibt die TF eines bestimmten Begriffs in jedem Dokument, das den Begriff enthält. Sie können die DF erhalten, indem Sie durch jedes < Dokument, Häufigkeit > Paar und die Anzahl der Paare zählen, obwohl TermEnums sollte schneller sein. IndexReader hat eine termDocs(Term) method, die eine TermDocs für den angegebenen Term und Index zurückgibt.

+0

Kann dieser Ansatz verwendet werden, um Termhäufigkeiten zu bestimmen, ist eine Ergebnismenge einer Lucene-Abfrage? –

+0

ist es möglich, termDocs zu verwenden, um die PhraseFrequency zu erhalten? – Dany

2

Die Stamm Version von Lucene (bis 4,0, schließlich sein) setzt nun die totalTermFreq() für jeden Begriff aus dem TermsEnum. Dies ist die Gesamtzahl, wie oft dieser Begriff in allen Inhalten angezeigt wurde (aber wie docFreq berücksichtigt er keine Löschungen).

+0

Mit Lucene 4.0, was ist äquivalent zu td.read (doc, freq), wo td ist ein TermDoc und doc und freq sind int []? – lizzie