# Schnelle intelligente Forumsuche mit Lucene



## Thomas Darimont (8. September 2009)

Hallo,

im Moment versuche ich unsere Forumsuche ein wenig zu verbessern. 

Motivation:
Wenn ich selbst unsere Suche verwenden
merke ich oft das einige (mir schon bekannte) Beiträge welche den Suchkriterien genügen in der Treffer Liste 
leider aus irgendwelchen Gründen nicht auftauchen. Außerdem dauert die Suche bei komplexen Abfragen oft mehr als 10 Sekunden
und die Ergebnisse sind oft wirr zusammen gewürfelt.

Die konkreten Ziele:
Schnelle intelligente Suche mit besseren Suchergebnissen als mit der normalen Forumsuche. 
komplexere Abfragen unterstützen (php sql count), Synonyme / Phrasen berücksichtigen
Antwortzeiten im 1-9 S. Bereich.
Bewertete Suchergebnisse (relevanz)
Datenbank entlasten. (Keine / weniger Suchanfragen mehr gegen Datenbank)
(Wie messen? -> subjektv, Userbewertung des Suchergebnisses, quantitativ mit Testmenge)


Zur Realisierung müsste ich wissen, wie man unsere Suche besser Verwenden kann bzw. wie sie aktuell verwendet wird.
Was haltet ihr für wichtiger: Suche nach Beitrag / oder nach Thread, oder beides?

Technisch werde ich Java und Lucene verwenden (http://lucene.apache.org/ http://lucene.apache.org/java/docs/index.html)
Erste Experimente sahen vielversprechend aus. Ein Index über alle Forum Posts ist mit den genannten Informationen
unter 1gb groß.

Vielleicht hat ja jemand von euch noch ein paar Tipps wie was man an dem Ansatz noch verbessern könnte 

Hier mal ein paar Gedanken zur aktuellen Implementierung.

1) Beiträge Analysieren / aus Datenbank auslesen

Aktuell experiementiere ich mit einem lokalen Auszug der Datenbank mit Posts, Forums, Threads. 

Problem: Viele unserer Beiträge enthalten im postText auch Programmcode, also Text in deutsch und englisch gemischt 
-> Was ist Stopwort / was nicht?  Nur deutsche Stopwörter? Nur Englische Stopwörter? -> Anhand von code Tags unterscheiden?
-> Passendes Stemming (reduzieren auf Stammform)?

2) Mit Informationen anreichern

Thread-Titel, Post-Title als PostText betrachten?
Für jedes "Dokument" mitabspeichern: ThreadId, PostId, UserId, Erstellungsdatum

Alle Posts eines Threads gemeinsam in ein großes Textdokument zusammenführen und als ein Dokument indizieren?
-> Kann Suchtreffer nur noch Thread aber nicht mehr entsprechendem Post zuordnen. Dafür besserer Filter für relevante Threads.
oder
Alle Posts eines Threads einzeln als viele kleine Textdokumente indizieren.
-> Kann Suchtreffer einzelnem Post zuordnen (ebenso Thread). "Manuelle" Aggregation zu Thread möglich.

Phrasen Liste verwalten 
-> Wenn im Text "Künstliche Intelligenz" auftaucht auch "KI" injezieren.
Hier muss man Phrasen Synonym Listen pflegen (kann inkrementell / iterativ erfolgen)

Synonymliste Verwalten und für entsprechende Keywords zusätzlich Synonyme in den zu indizierenden 
   Text reingenerieren (Wenn RDBS auch "relationales Datenbank System" einfügen).
Zusätzliche Begriffe injezieren (SQLInjection, Cross Site Scripting) => (Web) Security 


3) Beiträge Indizieren
Post indizieren parallelisieren: Um meine Mehrprozessormaschine optimal ausnutzen zu können bietet es 
sich an die Indexerstellung zu parallelisieren. 

4) Suche zugänglich machen:
Kleiner HTML / JavaScript Client (GWT) zur Interaktion mit dem Index (welcher über ein Servlet zugänglich gemacht wird).

Gruß Tom


----------



## Billie (8. September 2009)

Also nur kurz - ich persönliche klicke immer automatisch auf den Suchen-Button in der Head-Navigation (rechts neben Mitglieder-Karte) und ärgere mich jedesmal, dass automatisch alle Foren durchsucht werden. Dabei bin ich im Java-Forum und mich interessieren meistens auch nur Beiträge aus diesem Forum - allerdings natürlich mit Unterforen.

Ansonsten habe ich auch alte Beiträge nicht gefunden und habe dann lieber Google suchen lassen (site:tutorials.de) - hat besser funktioniert.

Beste Grüße,
Billie


----------



## Gainwar (10. September 2009)

Hallo!

Ich kann dir Lucene nur empfehlen. Ich arbeite seit langer Zeit damit. Auf Java und C++ Ebene und hatte nie ernsthafte Probleme damit. Ich setzte Lucene sogar für numerische Suchen ein. ( >=, >, <=, <, x-y, ==, != )

Grundsätzlich muss ich sagen ist man aber selbst dafür verantwortlich wie gut die Suche ist. Anhand von passenden _Tokenizern_ und _Analyzern_ bestimmt man die Qualität der Suchergebnisse. Das erfordert einiges an Zeit und Geduld bis man alles optimiert hat.

Für die Gestaltung eines _Document_ Elements sollte man sich viel Zeit nehmen. Da eine falsche Entscheidung hier gerade an der größe des Indexes viel ausmachen kann.

Hast du dir schon überlegt ob du mehrere Indexe machen möchtest oder alles in einen speichern willst? Beispielsweise für jedes Forum einen eigenen Index. Wenn Lucene die Indexe einmal geladen hat geht es ziemlich schnell. Ich persönlich bin ein Freund von einem großen Index, habe aber ein Projekt umgesetzt wo es ca. 800 Indexe gibt die im Durchschnitt 200 MB groß sind. Auch hier dauert eine Suche über alle Indexe im C++ gerade einmal 32ms.

*Performance:*
Lucene bietet außerdem die Möglichkeit Indexe im Speicher zu halten. Natürlich macht es jetzt nicht viel Sinn, wenn man einen Index hat der 3 gb groß ist in den Speicher zu laden. (Ich weis natürlich auch nicht was für ein System ihr habt.). Sollte man mehrere Indexe verwenden könnte man aber zumindest die am häufigsten durchsuchten in den Speicher laden und Lucene so einen schneller Zugriff darauf zu ermöglichen.

*Warm-Up:*
Ganz wichtig auch, wenn du Lucene verwendest, ist die Warm-Up-Search. Die erste Suche dauert immer Verhältnismäßig lang. Deswegen sollte unbedingt beim Start des "Lucene-Search-Services" eine Warm-Up-Search durchgeführt werden.

Erreichbarkeit:
Wie stehst du der Idee einer Web Service Anbindung gegenüber?

*Eine Suchtyp Idee:*
Eine weitere Idee wäre es vielleicht die Möglichkeit anzubieten nach Code zu suchen. Das wäre ja eigenltich leicht machbar. Die Code Absätze lassen sich ja einfach aus den Posts extrahieren und in ein extra _FIeld_ eines _Document's_ speichern. Ich weis nicht ob es nützlich ist und verwendet wird, dafür müsste man die Benutzer befragen ^^

Soo.. ich hätte noch mehr, aber ich muss jetzt erstmal weiter arbeiten 
Compiler ist durch also kann ich wieder was machen ^^

Grüße,
Manuel.


----------

