Thomas Darimont
Erfahrenes Mitglied
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
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