Frank0837: Mysql fulltext Recherche

Hallo Forum,
Die folgende Frage entspricht ganz dem Motto von SELFHTML ("Die Energie des Verstehens"), auf Deutsch: Ich brauch's nicht beruflich, aber ich möchte es mal gemacht haben.

Ich möchte eine DB erstellen, in der ich z.B. in Gedichten nach Zitaten suchen kann. Die Art der Ausgabe sollte aussehen wie z.B. im Forumsarchiv: Fundstelle und benachbarte Textstrings. Dazu brauche ich den Textkörper, die Überschrift, ein Erstellungsjahr und den Namen des Autors etc.

Mysql bietet die Volltext-Suche (Select ... from ... where match ...against...). Dieser Fulltext Index wird für jede einzelne Tabelle in der DB erstellt. Ich möchte weder Perl noch C  etc verwenden. Über PHP will ich nicht hinaus.

Man kann pro Gedicht eine Tabelle und dort je Zeile einen Satz anlegen. Dann hat man sehr bald einen unübersichtlichen Wust an Tabellen und vermutlich sehr lange Antwortzeiten, weil man in einer Schleife mit der Suche alle Tabellen durchlaufen muss. Diese Lösung fällt wohl aus.

Also alle Gedichte in eine Tabelle: Es erhebt sich die Frage, wie man die Texte gegenseitig abgrenzt und wie man in dem jeweiligen Abschnitt der Tabelle die jeweils korrekten Verweise auf Titel, Jahr und Dichter setzt.

Hier hänge ich jetzt fest. Ich hab'zwar eine unausgegorene Idee, aber die widerspricht der Idee eine DB so total...

Hat bitte jemand eine Idee, wie man das lösen kann?

Frank

  1. Halihallo Frank0837

    Ich möchte eine DB erstellen, in der ich z.B. in Gedichten nach Zitaten suchen kann. Die Art der Ausgabe sollte aussehen wie z.B. im Forumsarchiv: Fundstelle und benachbarte Textstrings. Dazu brauche ich den Textkörper, die Überschrift, ein Erstellungsjahr und den Namen des Autors etc.

    Also, was für Informationen musst du verwalten?
     - Fundstelle: Gedicht,Zeile
     - Überschrift
     - Erstellungsjahr
     - Name des Autors

    Man kann pro Gedicht eine Tabelle und dort je Zeile einen Satz anlegen. Dann hat man sehr bald einen unübersichtlichen Wust an Tabellen und vermutlich sehr lange Antwortzeiten, weil man in einer Schleife mit der Suche alle Tabellen durchlaufen muss. Diese Lösung fällt wohl aus.

    Ja. Die Tabellen und Spalten sollten im optimalfall auf eh und jeh gleich bleiben, sodass
    gar deine Kinder und Kindeskinder noch dasselbe Tabellenschema verwenden können. Es ist
    Datenbanktechnisch gesehen ein Graus, wenn jeden Tag neue Tabellen hinzukommen; das ist
    charakteristisch für ein schlecht durchdachtes Schema.

    Also alle Gedichte in eine Tabelle: Es erhebt sich die Frage, wie man die Texte gegenseitig abgrenzt und wie man in dem jeweiligen Abschnitt der Tabelle die jeweils korrekten Verweise auf Titel, Jahr und Dichter setzt.

    Nochmals von oben, du musst dir überlegen, welche Information du verwalten möchtest. Dann
    fasst du Informationen zusammen, die auch irgendwie zusammenhängen und sich auf das
    gleiche "Objekt" beziehen. Also:

    Informationen sind:
     - Gedicht
     - Zeile vom Gedicht
     - Überschrift
     - Erstellungsjahr
     - Name des Autors

    Du hast also Gedichte als Ansammlung von Zeilen vorliegen, das gehört schon mal getrennt.
    Sprich: Alle Infomationen zu Gedichten in die eine und alle Informationen zu
    Gedichtzeile in die andere Tabelle. Dann haben wir noch Überschrift, die macht wohl in
    der "Gedicht" Tabelle Sinn, Erstellungsjahr ebenso, und Name des Autors, naja, der
    Einfachheit halber auch in die Gedicht-Tabelle (obwohl man dies spätestens dann Trennen
    sollte, wenn du für einen Dichter mehrere Informationen speicherst, wie z. B.
    Gebrutsjahr oder sowas).

    Tabelle Gedicht:

    gedicht_nummer        jedes Gedicht bekommt intern eine Nummer zugewiesen
    ueberschrift
    erstellungs_jahr
    name_des_autors

    Tabelle GedichtZeile:

    gedicht_nummer        damit ist die Zeile dann mit einem bestimmten Gedicht "verbunden"
    zeilen_nummer         welche Zeile des Gedichtes, wird hier gespeichert?
    zeilen_inhalt         und das ist der Text, den du mit Fulltext-Search durchsuchen kannst

    Wenn du nun einen Fulltext-Search machst, kannst du vom Resultat die zeilen_nummer und
    die gedicht_nummer auslesen und anzeigen. Falls du auch die Texte "drum-herum" haben
    willst, bräuchtest du einen zweiten Query, der z. B. 5 Linien bevor, bis 5 Linien danach
    auswählt (oder dasselbe mit PHP simulieren).
    Wenn es dir egal ist, in welcher Zeile der Text denn auch vorkommt, brauchst du die
    GedichtZeile-Tabelle nicht, dann ginge auch ein Feld gedicht_inhalt in der Tabelle
    Gedicht, welches du durchsuchst.

    Viele Grüsse

    Philipp

  2. Hi Frank0837,

    Ich möchte eine DB erstellen, in der ich z.B. in Gedichten nach Zitaten suchen kann. Die Art der Ausgabe sollte aussehen wie z.B. im Forumsarchiv: Fundstelle und benachbarte Textstrings. Dazu brauche ich den Textkörper, die Überschrift, ein Erstellungsjahr und den Namen des Autors etc.

    Was Du aber nicht (unbedingt) brauchst, das ist die Modellierung der Zeile in Deiner Datenstuktur. Du kannst sehr erst mal die Gedichte finden - und als Treffer Deiner Suche dann Links auf einen Gedichte-Viewer generieren, welcher das Gedicht anzeigt und "beautified", also mit einem zusätzlichen CGI-Parameter für den Suchbegriff aufgerufen wird, das Gedicht parsed und das Vorkommen des Suchbegriffs innerhalb des Textes hervorhebt oder was auch immer.
    Diese Trennung zwischen Suche und Darstellung ist für Dein Datenmodell absolut wesentlich - denn wenn Dir das gerade Beschriebene ausreicht, dann brauchst Du keinen Substruktur eines Gedichtes modellieren.

    Man kann pro Gedicht eine Tabelle

    Um Himmels willen, nein. Natürlich eine Tabelle über alle Gedichte, und eine Zeile pro Gedicht - notfalls eine Zeile pro Gedichtszeile, falls Dein Datenmodell das tatsächlicht erzwingen sollte. Und in jeder Zeile eine Referenz auf den Primärschlüssel einer anderen Tabelle, in welcher dann Meta-Daten des Gedichts (Autor etc.) gespeichert sind - diese werden also erst dazu geJOINt.

    Also alle Gedichte in eine Tabelle:

    Ja.

    Es erhebt sich die Frage, wie man die Texte gegenseitig abgrenzt

    Eine Zeile pro Gedicht.

    und wie man in dem jeweiligen Abschnitt der Tabelle die jeweils korrekten Verweise auf Titel, Jahr und Dichter setzt.

    Wenn Du nur eine Zeile pro Gedicht hast, dann ist das kein Problem. Hast Du mehrere Zeilen pro Gedicht, dann hast Du also eine n:1-Relation dieser Tabelle zu der Menge der Gedichte - und folglich lagerst Du dann die Meta-Daten des Gedichts in eine andere Tabelle aus, deren Primärschlüssel dann das einzige weitere Feld Deiner Gedichte-Text-Tabelle wird.

    Viele Grüße
          Michael

    --
    T'Pol: I apologize if I acted inappropriately.
    V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.