Announcement

Collapse
No announcement yet.

Volltextsuche

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Volltextsuche

    Wieder mal eine kleine Herausforderung :-)

    Würde mit CPB gerne eine Voolltextsuche reaslisieren, habe aber leider keine Ahnung wie ich da anfangen soll. Ziel soll es sein über mehrere Datenbankfelder alle Sätze zu finden in denen die im Suchtext angegebenen 'Worte' vorkommen. Na ja, und schnell soll das Ganze natürlich auch noch sein. *smile*

    Kann mir da jemand weiter helfen, oder einen Tutorial-Link nennen.

    Danke

    Manfred

  • #2
    Hallo Manfred,

    ob das bei einer Datenbank geht, weiss ich zwar nicht so genau, aber könnte man da etwas mit FindDialog machen?

    Gruss
    Irmgar

    Comment


    • #3
      Hi Manfred, <br>
      wie waers mit folgendem:<br>
      ZuIndizierendenTabelle: ZuIndizierendenTabelleID, Text1, Text2, Text3 ..
      Tabelle1: Tabelle1ID, Suchtext;<br>
      Tabelle2: Tabelle1ID, ZuIndizierendenTabelleID<p>
      Bei jedem Insert in ZuIndizierendenTabelleID zerlegst Du die Saetze in Text1 - TextX in einzelne Worte, suchst nach den einzelnen Worten in Tabelle1, fuegst diese in Tabell1 ein wenn die Worte nicht vorhanden sind, und verknuepfst die ueber Tabelle2 mit ZuIndizierendenTabelleID.<br>
      Wenn Du eine Treffermenge erhaelst, fuegst Du nur die Links in Tabelle2 hinzu.<br>
      Fuer die Suche brauchst Du dann nur ueber Tabelle1 zu suchen, und erhaelst ueber Tabelle2 die entsprechende ID fuer ZuIndizierendenTabelle, die Du dann einfach anzeigen kannst.<p>
      Viel Spass,<br>
      CU Chri

      Comment


      • #4
        Hallo Irmgard, Hallo Chris,

        FindDialog ist wohl nicht das Richtige, aber die Idee von Chris, die ich nicht so richtig verstanden habe, hat mich auf eine Idee gebracht und das ginge in etwa so:

        Datentabelle: Nennen wir sie 'Musik' mit den Feldern Satz,Interpret und Titel (und noch einigen anderen die aber uninteressant sind)

        Suchtabelle: Nennen wir sie 'Such' mit den Feldern Wort, Tabelle, Feld und Zielsatz.

        Bei jedem Einfügen eines satzes in die Datentabelle Musik Werden die Strings der Felder Interpret und Titel in einzelne Worte zerlegt.

        Für jedes Wort wird nun in die Suchtabelle ein Satz eingefügt mit dem Wort, dem Namen der Tabelle (hier: Musik), dem Feldnamen und der Satznummer der Datentabelle.

        Ich kann dann in der Suchtabelle über 'Wort' suchen und alle Treffer im Direkten Zugriff (anhand der satznummer) aus der oder den Datentabelle auslesen.

        Ist das in etwa das was Du meintest?????

        Etwas aufwendig wird das Ganze allerdings wenn ich in der Datentabelle Sätze verändere, aber dazu muß ich mir eben noch was einfallen lassen.

        Erstmal vielen Dank für den Schupps in die (hoffentlich) richtige Richtung.

        Manfre

        Comment


        • #5
          Hi Manfred,<br>
          naja, fast. Deine Loesung hat mehrere Nachteile:<br>
          1. deine Tabellen sind nicht normalisiert (allgemein, gilt nicht nur fuer Suche). <br>
          2. du wirst sehr viele doppelte Eintraege haben, die bei grossen Datenmengen sehr viel Platz wegnehmen.<p>
          zu 1.<br>
          Wenn Du nur eine Tabelle hast, so sehen deine Daten wie folgt aus:
          <pre>
          1 | Groenemeier | blick zurueck
          2 | Groenemeier | der weg
          3 | Groenemeier | dort und hier
          </pre>
          Normalerweise hast Du ja eine Tabelle fuer Interpret, eine fuer Alben, eine fuer Songs ... <br>
          zu 2. auch hier solltest Du die Tabellen trennen, da Du sonst sehr viel Speicherplatz verbraetst. Ein Insert ist zudem immer langsamer als ein select (bzw. den kannst Du besser zwischen cachen). <br>
          Ich dachte an folgendes:
          <pre>
          create table suche (
          suche_id double precision,
          suchtext varchar(70));

          create table suche_link (
          suche_id double precision,
          fremd_id double precision);
          </pre>
          in die Tabelle suche wird nun jedes einzelne Wort eines Eintrags eingetragen, und ueber die suche_link mit dem entsprechenden Datensatz verbunden. Das geschieht wie folgt (pseudocode):
          <pre>
          zerlege_text_in_worte();
          solange einzelne_worte{
          ist wort in Tabelle suche {
          fuege eintrag in suche_link hinzu
          } sonst {
          fuege eintrag in suche hinzu
          fuege eintrag in suche_link hinzu
          }
          }
          </pre>
          Wenn Du das ganze normalisierst, und immer noch eine solche suche basteln willst, solltest Du noch ein zusaetzliches Kriterium, das die Tabelle identifiziert, in die Tabelle suche_link aufnehmen.<br>
          Wenn Du eh wenige Datensaetze hast, und diese Muehe scheust, kannst Du ja mit LIKE Suchen - allerdings dann auf die Gefahr hin, dass kein Index verwendet wird.<p>

          CU Chri

          Comment


          • #6
            Hi Chris,

            thanks a lot für die umfassende Erläuterung. Das die Datentabellen natürlich zu normalisieren sind war schon klar ... hätte ich ja auch erwähnen können :-))

            Die Suchtabellen aufzusplitten ist aber eine idee auf die ich nicht gekommen bin .... bringt mich richtig gut weiter und wie schon von dir bemerkt .... like ist net gut, denn die DB wird mehrere 100tausend Sätze enthalten.

            Danke nochmals

            Manfre

            Comment

            Working...
            X