Vorwort: wieso ein Blog zu PHP, Solr und Lucene?

Wieso ein Blog zu PHP, Solr und Lucene?
Gegenstand und Ausgangspunkt all unserer Aktivitäten auf diesem Gebiet war ein Projekt um ein Nachrichtenportal und die Aufgabe, Recherchen und Analysen im Nachrichtenbestand von über 10 Million News performant zu handeln. Die MySQL Volltextsuche kam da schnell an Ihre grenzen, Oracle war keine Alternative.
Es reifte also die Frage, wie können andere (etwa die Internetsuchmaschiene google) immense Datenmengen spielend handeln?
Wir lösten den MySQL volltext mit Lucene ab. Der Performancegewinn war dramatisch. Suchen im Datenbestand, die vorher über 10 Sekunden dauerten, brauchen mittels Lucene und Solr nur selten mehr als 20ms!
Eine neue Welt tat sich auf, die es zu erobern galt und schnell fiel auf, dass deutschsprachige Seiten zum Thema Mangelware sind. Dies soll sich mit diesem Blog ein wenig ändern.

Sie haben Fragen zu Solr/Lucene/PHP? Schreiben sie uns einen Kommentar!

Freitag, 14. September 2012

mehere Solr Suchen / Abfragen in einem Request / URL Aufruf

Bei der Arbeit mit Solr /Lucene ergibt sich oft die Anforderung, dass für mehrere Suchbegriffe eine Solr Abfrage ausgelöst werden muss. Oftmals ändern sich dabei noch nicht einmal die FilterQuery Parameter, sondern lediglich der Suchbegriff. Jede Suchanfrage beginnt dabei mit dem Verbindungsaufbei vom Client / Applikation zum Solr Server. Es läppern sich Latzenzzeiten und Overhead. Die Frage ist also: Kann man in einem einzelnen Solr Request mehrere Suchen verarbeiten / durchführen?
Ja.
Im Hintergrund greift dabei eine Funktion, auf die wir hier bereits eingegangen sind:   "Field Collapsing". Die Idee ist, nach * zu suchen und dabei nur bestimmte Ergebnisse zu gruppieren und damit zurückzugeben.
Dadurch kann in einem einzigen Aufruf einer Solr URL, das Ergebnis meherer Suchen zurückgeliefert werden.
Im nachfolgenden Beispiel suche ich nach Deutschland, Frankreich, Schweizin nur einem Request.

http://localhost:8088
            /solr/select/?q=*:*&
                          rows=1&
                          group=true&
                          group.limit=200 
                          group.query=deutschland&
                          group.query=frankreich& 
                          group.query=schweiz
 
Auch hier ist wichtig der Parameter group.limit= denn hiermit wird angegeben, wie viele Dokumente zu einem Suchbegriff geliefert werden sollen. "-1" steht dabei für "alle", allerdings gibt es hier Probleme beim caching. Der Ausweg ist entweder eine besonders große zahl einzugeben: group.limit=1000000 oder dann doch einzelne Suchabfragen durchzuführen, welche dann natürlich auch mit dem entsprechenden Overhead verbunden sind.

Keine Kommentare:

Kommentar veröffentlichen