split.s: mysql Fulltext, LIKE usw. und BBCode/HTML

Ich habe folgendes Problem:

ich hab ein Forum gebaut in welchem BBCode möglich ist.
Meine Frage: Wenn ich eine Volltextsuche ermöglichen will, wird ja unsinnigerweise der ganze BBCode ebenfalls in Indexe gespeichert.
Außerdem findet man auf der Suche nach url, size, color viele Ergebnisse, die aber allesamt die gesuchten Wörter nicht enthalten weil sie ja logischerweise vor der Ausgabe auf den Bildschirm geparst werden, d.h. color wird durch <span style="color:x"></span> ersetzt usw.

Wie macht ihr sowas?

  1. Hi,

    Wie macht ihr sowas?

    Wie bitte, was genau?

    Vielleicht einfach mal n Tipp ins Blaue:
    Wenn du einen neuen Beitrag/Post (wie auch immer das heisst) speichern willst, dann speicher ihn doch zwei mal mit der selben Id in verschiedenen Tabellen und in der selben Tabelle in verschiedenen Spalten. Für die eine lässt du den BBCode drin, bei der anderen schnippselst du ihn raus. Und durchsuchen mit zb einen FULL TEXT INDEX tust du dann nur die Spalte ohne BBCode? Rausschnippseln kannst du mithilfe von Regular Expression in PHP machen oder sonst irgendeiner intellenten Sprache.

    Ciao, Frank

    1. Hi Frank!
      Danke für die Antwort.

      Auf die Idee bin ich auch schon gekommen, habe mich aber etwas gescheut quasi den gesamten Datenbestand zu verdoppeln. Ist das denn eine gängige Praktik für Foren?

      1. keine Ahnung, ob das eine gängige Praktik bei Foren ist, bin nicht in dem Bereich tätig.

        Betreffs "verdoppeln" Wie gross ist denn so ein Beitrag im Durchschnitt, n Kilobyte? 100'000 Beiträge macht also 100MB, das ganze verdoppeln dann also 200MB. 200MB sind doch heutzutage nicht mehr viel. :)

        Aber die Anforderungen sind doch eigentlich klar:

        • Du willst keinen BBCode bei der Suche berücksichtigen
        • BBCode ist einfach mit der Nachricht zusammen als Text gespeichert
        • Du musst also irgendwie die Nachricht von diesem BBCode befreien beim Suchen

        Ciao, Frank

        1. hi,

          • Du willst keinen BBCode bei der Suche berücksichtigen
          • Du musst also irgendwie die Nachricht von diesem BBCode befreien beim Suchen

          Das könnte er auch mit einem RegExp beim auslesen des Index lösen, ohne die Einträge doppelt zu speichern.
          Also den BBCode rausschnippseln, bevor die suchergebnisse im HTML ausgegeben werden.

          mfg

            • Du musst also irgendwie die Nachricht von diesem BBCode befreien beim Suchen
              Das könnte er auch mit einem RegExp beim auslesen des Index lösen, ohne die Einträge doppelt zu speichern.

            Ähm, es ging ja darum _nicht_ den BBCode zu suchen. Und das den internen Suchmechanismen von MySQL beizubringen, könnte u.U. nicht so einfach werden. Für MySQL ist Text einfach nur Text, ohne weitere semantische Bedeutung.

            Und erst alle Nachrichten aus der DB zu lesen, dann mit PHP das BBCode Zeugs zu entfernen und dann mit PHP noch nach den eigentlichen Suchparametern zu suchen, dürfte ein weit grösserer Overkill sein als die geeignete (wenn auch u.U. doppelte) Speicherung.

            Also den BBCode rausschnippseln, bevor die suchergebnisse im HTML ausgegeben werden.

            Da kann er dann die Funktion, die er sowieso brauchen wird, ja gleich wiederverwenden. :)   Aber wozu sollte er ihn aus den Suchergebnissen wieder entfernen wollen, die Suchergebnisse sind ja die "fachlich" relevanten Forenbeiträge.

            FF