2012-04-06 13 views

Antwort

7

Rückkehr all Ergebnisse ist nie eine gute Option, da es in der Leistung sehr langsam sein würde.
Können Sie Ihren Anwendungsfall erwähnen?

Solr rows Parameter hilft Ihnen auch, die Anzahl der Ergebnisse zu optimieren.
Allerdings glaube ich nicht, dass es eine Möglichkeit gibt, Zeilen zu optimieren, um alle Ergebnisse zurückzugeben. Es braucht nicht -1 als Wert.
Sie müssten also einen hohen Wert für alle zurückgegebenen Ergebnisse festlegen.

+0

Unsere Erfahrung (und Rücksprache) war die gleiche: Die Verwendung von Solr als Filter-und-Return-All-Results-System ist alles andere als optimal. Es wurde einfach nicht für die Rückgabe aller Ergebnisse entwickelt. Wir wünschen uns jedoch, dass es einen Weg gibt, mindestens alle übereinstimmenden "Schlüssel" (Schlüsselfeldwerte) zu erhalten. Siehe hierzu [ähnliche Frage] (http://stackoverflow.com/questions/16280837/solr-query-get-results-without-scanning-files) – Yonatan

32

Ich erinnere mich selbst zu tun & rows = 2147483647

2.147.483.647 ist Maximalwert der Ganzzahl. Ich erinnere mich daran, eine Nummer größer als diese einmal zu verwenden und eine NumberFormatException zu haben, weil sie nicht in einen int geparst werden konnte. Ich weiß nicht, ob sie Long heutzutage benutzen, aber 2 Milliarden Zeilen sind normalerweise mehr als genug.

Kleine Anmerkung:
Seien Sie vorsichtig, wenn Sie planen, dies in der Produktion zu tun. Wenn Sie eine Abfrage wie *: * ausführen und Ihr Index groß ist, könnten Sie ein paar Gigabyte in diese Abfrage übertragen.
Wenn Sie wissen, dass Sie nicht viele Dokumente haben werden, gehen Sie voran und verwenden Sie den maximalen Wert von integer.

Auf der anderen Seite, wenn Sie ein einmaliges Skript tun und nur alle Ergebnisse (zum Beispiel Dokument-IDs) dumpen müssen, dann ist dieser Ansatz gültig, wenn es Ihnen nichts ausmacht 3-5 Minuten für eine Abfrage zu warten zurückgeben.

+3

Verwenden Sie Integer.MAX_VALUE (2147483647) nicht als Wert für Zeilen in der Produktion . Dies wird Ihre Abfrage stark verlangsamen, selbst wenn Sie eine kleine Ergebnismenge haben, da solr eine Warteschlange in dieser Größe vorbelegt. siehe https://issues.apache.org/jira/browse/SOLR-7580 – Simulant

+1

Gefährlich. Tun Sie dies nur für eine kleine Anzahl von Dokumenten. – freedev

0

Für die Auswahl aller Dokumente in dismax/edisma per Solarium php client funktioniert die normale Abfragesyntax : nicht. Um alle Dokumente auszuwählen, setzen Sie den Standard-Abfragewert in der Solario-Abfrage auf eine leere Zeichenfolge. Dies ist erforderlich, da die Standardabfrage in Solarium : ist. Setzen Sie die alternative Abfrage auch auf :. Die normale Abfragesyntax von Dismax/eDismax unterstützt : nicht, aber die alternative Abfragesyntax tut dies.

Für weitere Informationen folgende Buch kann

http://www.packtpub.com/apache-solr-php-integration/book

-3

query.setRows (Integer.MAX_VALUE) bezeichnet werden; funktioniert für mich !!

+0

wie Sie diese Anweisung verwenden.Es wird nur 10 selbst nach der Verwendung dieser Aussage. –

+1

Vorsicht mit diesem. Ich habe es in einem sehr speziellen Fall verwendet, in dem die tatsächliche Anzahl durch die Client-App begrenzt wurde. Bei der Bereitstellung auf dem Produktionsserver habe ich deshalb eine java.lang.NegativeArraySizeException erhalten. – s1m3n

2

Sie sollten zuerst eine SolrQuery erstellen, die unten angezeigt wird, und die Anzahl der Dokumente festlegen, die Sie in einem Stapel abrufen möchten.

Hier betrachte ich ein Beispiel für die Suche nach ID, Sie können es mit einem Ihrer Parameter ersetzen, um zu suchen.

Das "lastResult" ist die Variable, die Sie nach der Ausführung der ersten 500 Datensätze ändern können (500 ist die Batch-Größe) und setzen Sie sie auf die letzte ID, die aus den Ergebnissen erhalten wurde.

Dies hilft Ihnen beim Ausführen des nächsten Stapels, beginnend mit dem letzten Ergebnis des vorherigen Stapels.

Hoffe, das hilft. Schreibe einen Kommentar unten, wenn du eine Klarstellung brauchst.

0

Wie die anderen Antworten darauf hingewiesen haben, können Sie die Zeilen als maximale Ganzzahl konfigurieren, um alle Ergebnisse für eine Abfrage zurückzugeben. Ich würde jedoch empfehlen, Solr feature of pagination zu verwenden, und erstellen Sie eine Funktion, die für Sie alle Ergebnisse mithilfe der CursorMark API zurückgibt. Der Kern davon ist, dass Sie den cursorMark-Parameter auf '*' setzen, die Seitengröße einstellen (Zeilenparameter), und auf jedem Ergebnis erhalten Sie einen cursorMark für die nächste Seite, so dass Sie dieselbe Abfrage nur mit dem cursorMark ausführen vom letzten Ergebnis gegeben. Auf diese Weise haben Sie mehr Flexibilität in Bezug auf die Ergebnisse, die Sie wünschen, auf eine viel performantere Art und Weise.

2

Ich würde vorschlagen, Deep Paging zu verwenden.

Einfache Paginierung ist eine einfache Sache, wenn Sie nur wenige Dokumente zu lesen haben und alles, was Sie tun müssen, mit den Parametern start und rows spielen. Aber wenn Sie viele Dokumente haben, ich meine Hunderttausende oder sogar Millionen, ist das kein gangbarer Weg.
Das ist die Sache, die Ihren Solr-Server in die Knie zwingen könnte.

Für typische Anwendungen die Suchergebnisse einen menschlichen Benutzer anzeigt, dies neigt dazu, viel von einem Problem nicht zu sein, da die meisten Nutzer interessieren sich nicht über Drilldown über die erste Handvoll Seiten der Suchergebnisse - aber für automatisierte Systeme, die Daten über alle Dokumente zu einer Abfrage knirschen wollen, kann es ernsthaft prohibitiv sein.

Das bedeutet, wenn Sie eine Website haben und Paging-Suchergebnisse, ein echter Benutzer geht nicht so weiter, aber auf der anderen Seite betrachten, was versuchen, wenn eine Spinne oder ein Schaber passieren kann alle Seiten der Website zu lesen .

Jetzt sprechen wir von Deep Paging.

Ich werde vorschlagen, diesen erstaunlichen Beitrag zu lesen:

https://lucidworks.com/blog/2013/12/12/coming-soon-to-solr-efficient-cursor-based-iteration-of-large-result-sets/

Und einen Blick auf diesem Dokument Seite nehmen:

https://cwiki.apache.org/confluence/display/solr/Pagination+of+Results

Und hier ist ein Beispiel, das zu erklären versuchen, wie mit den Cursorn paginieren.

+0

Wenn ich nach Id sortiere, wird dies nicht den Standardrelevanzwert beeinflussen? Gibt es eine Problemumgehung – Cybermonk

+1

Umformatierung, kann ich es auf nichts sortieren und weiterhin Cursor-Markierung verwenden? – Cybermonk

+0

Nach einigem Lesen wurde festgestellt, dass 'sort = score desc, id asc' die Standardsortierung aktiviert. ID wird als Tiebreaker verwendet – Cybermonk

Verwandte Themen