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!

Montag, 13. Oktober 2014

Suchergebnis verbessern: zusammenhängende Worte besser berücksichtigen

Die Relevanzsortierung von Solr/Lucene ist von Haus aus schon sehr gut. Hin und wieder ergeben sich aber Potential, die Suchergebnisse von Solr weiter zu verbessern.
Das Suchergebnis ist regelmäßig (nicht immer) dann besser, wenn die Suchbegriffe in exakt der gleichen Reihenfolge auch im Text vorkommen.

In erster Linie geht es dabei also um die Verbesserung der Relevanzsortierung.

Beispiel die Suche nach: berliner currywurst
Ein valides Ergebnis wäre folgender Text: "Der Berliner Max fährt nach Hessen, um bei Best Worscht in Town eine Frankfurter Currywurst zu essen".
Basierend auf den Suchbegriff ist das Suchergebnis aber wenig relevant. Denn es geht hier um eine Frankfruter Currywurst, keine Berliner.
Relevanter ist folgender Text: "Der Frankfurter Moritz fährt nach Kreuzberg, um bei Curry 36 eine Berliner Currywurst zu essen."

Die Lösung besteht darin, Dokumente in Ihrer Sortierung zu Boosten, welche die Suchbegriffe in exakt der eingegebenen Reihenfolge und hintereinander aufweisen. Unabhängig davon, ob der Anwender eine phrasierte Suche gestartet hat oder nicht.

Hilfe kommt hier vom DisMax Suchhandler bzw. eDsiMax Query Parser.
Dort wird zum einem definiert, wie das Vorkommen der Suchbegriffe in einzelnen Feldern zu gewichten ist:

  <requestHandler name="/select" class="solr.SearchHandler" default="true">
[...]
       <str name="qf">
            PROVIDER^10 KATEGORIE^3 UEBSCHRIFT^5.5 TEXT^1.5

Zusätzlich kann man jedoch der "pf" (phrase Fields) Parameter kann genutzt werden, um die Dokumente in der Sortierung höher zu gewischten, bei denen die Suchbegriffe möglichst eng aneinander stehen.
  <requestHandler name="/select" class="solr.SearchHandler" default="true">
[...]
       <str name="qf">
            PROVIDER^10 KATEGORIE^3 UEBSCHRIFT^5.5 TEXT^1.5
       </str>
       <str name="pf">
          PROVIDER^10 UEBSCHRIFT^5.0 TEXT^1.5
       </str>

Abschließend den Server neu starten und die Anwendungen werden aktiv.

Keine Kommentare:

Kommentar veröffentlichen