Mysql fulltext Recherche
Frank0837
- design/layout
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
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).
gedicht_nummer jedes Gedicht bekommt intern eine Nummer zugewiesen
ueberschrift
erstellungs_jahr
name_des_autors
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
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