2012-03-26 14 views
5

Wir haben eine Solr-Instanz mit 86.315.770 Dokumenten. Es verwendet bis zu 4 GB Arbeitsspeicher und wir benötigen es für die Facettierung auf einem Token-Feld namens Content. Die Indexgröße auf der Festplatte beträgt 23 GB.Solr facettierte Suche Leistungsempfehlungen

Warum stehen wir einem Token-Feld gegenüber? Weil wir die obersten "n" am häufigsten verwendeten Begriffe in diesem Feld abfragen wollen. Problem ist, es dauert viel zu lange, um solche Abfragen durchzuführen. Gibt es eine Möglichkeit, die Zeiten zu verbessern, wenn man Facettierungen durchführt? Irgendwelche Empfehlungen?

Vielen Dank im Voraus.

+0

Setzen Sie 'facet.limit'? Ich habe festgestellt, dass solche Abfragen auch bei über 100.000 Datensätzen sehr lange dauern können, wenn 'facet.limit' nicht gesetzt ist (in Ihrem Fall, was immer' n' sein mag). –

Antwort

2

Da Solr Facetten in In-Memory-Datenstrukturen berechnet, ist die Facettenberechnung wahrscheinlich CPU-gebunden. Der Code zum Berechnen von Facetten ist bereits hoch optimiert (die getCounts Methode in UnInvertedField für ein mehrwertiges Feld).

Eine Idee wäre, die Berechnung zu parallelisieren. Vielleicht ist der einfachste Weg, dies zu tun, Ihre Sammlung in mehrere Shards aufzuteilen, wie in Do multiple Solr shards on a single machine improve performance? beschrieben.

Wenn Ihr Wörterbuch klein genug ist und Abfragen eine begrenzte Anzahl von Formularen annehmen können, können Sie ein anderes System einrichten, das die Zählmatrix für jedes (Term, Query) -Paar verwaltet. Wenn Sie z. B. nur Termabfragen zulassen, müssen Sie die Anzahl für jedes Termepaar beibehalten. Beachten Sie, dass dies abhängig von der Gesamtzahl der Begriffe und Abfragen viel Speicherplatz erfordern würde. Wenn Sie die Zählungen nicht genau benötigen, ist es vielleicht am einfachsten, diese Zählwerte in einem Batch-Prozess zu berechnen. Sonst wäre es (möglich, aber) ein wenig schwierig, die Anzahl der Zähler mit Solr zu synchronisieren.

0

Sie könnten die topTerms Funktion von LukeRequestHandler verwenden.

+0

Problem ist, dass ich den Begriff count auf eine Abfrage anwenden muss. Ist das mit topTerms möglich? – rreyes1979

+0

Sie würden den Parameter 'numTerms' der Luke-Anfrage auf die von Ihnen gewünschte Zahl setzen, ähnlich der Verwendung von' facet.limit', wie ich oben in meinem Kommentar erklärt habe. Luke gibt jedoch unterschiedliche #s für Begriffe in Ihrem Index zurück als normale Facettierungen, da Luke topTerms für Dokumente in Ihrem Index zurückgibt, die nicht mehr suchbar sind (d. H. Diejenigen, die gelöscht wurden, aber noch nicht zusammengeführt wurden). –

+0

Auch habe ich die Geschwindigkeit von Luke gegen Facettierung getestet und es dauert immer länger. Das heißt, wenn Sie Solr 3.6 oder 4.0 verwenden, gab es in diesen Versionen einige Geschwindigkeitsverbesserungen im LukeRequestHandler. –