Relevanz von Suchergebnissen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Relevanz von Suchergebnissen

    Hallo,
    ich bastel gerade an einer Volltextsuche.
    Die Suche bekommt einen String übergeben.
    Jetzt habe ich in der DB 3 Spalten die durchsucht werden sollen.
    Ansich ja kein Thema, allerdings sollen die Spalten jetzt unterschiedliche Relevanzen erhalten.

    Soll heißen, in den Treffern sollen die Ergebnisse dann sortiert sein nach,
    Treffer in Spalte 1, Treffer in Spalte 2, Treffer in Spalte 3.

    Bei einer einfachen Abfrage mit OR und AND bekomme ich ja die Treffer nicht in dieser Sortierung raus. Klar könnte ich 3 Abfragen machen und dann alles in ein Array speichern und weiter verarbeiten. Ich würde aber gern mit Limit von MySQL arbeiten, da jedesmal eine recht große Zahl abgefragt wird.

    Ich habe mir auch schon "union" zum verbinden der verschiedenen Querys angesehen, denke aber das es eher suboptimal dafür geeignet ist,
    oder hat jemand schon andere Erfahrungen damit gemacht?

  • #2
    Man könnte mittels IF() "Hilfsspalten" basteln, die jeweils 1 oder 0 zugewiesen bekommen, je nachdem ob in Spalte X ein Treffer vorliegt oder nicht, und dann nacheinander nach diesen Werten sortieren.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      hm, das scheint relativ performancelastig zu sein.
      Also wird es wohl doch eher darauf hinauslaufen
      das ich es auf 3 Abfragen aufteile und dann die Arrays zusammenführe.

      Kommentar


      • #4
        Zitat von Joxa Beitrag anzeigen
        hm, das scheint relativ performancelastig zu sein.
        Wieso?

        Wie sehen deine Vergleiche aus? Eher simpel, oder beinhalten die komplizierte Zeichenkettenoperation/RegExp ...?
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          warum sammelst du nicht alle Wörter in einer Wortdatenbank

          In einer 2. Tabelle merkst du dir wie häufig ein Wort in einem Text vorgekommen ist. Die Häufigkeit ist gleich eine Größe für die Relevanz der Begriffe.

          z.b.

          PHP-Code:
          CREATE TABLE `searchdb_index_de` (
              `
          FK_WORDSBIGINT(10UNSIGNED NOT NULL  DEFAULT '0',
              `
          FK_IDBIGINT(20UNSIGNED NOT NULL  DEFAULT '0',
              `
          S_TABLECHAR(15NOT NULL  DEFAULT '',
              `
          SCORETINYINT(3UNSIGNED NOT NULL  DEFAULT '1',
              `
          DIRVARCHAR(100NOT NULL  DEFAULT '',
              `
          FILEVARCHAR(100NOT NULL  DEFAULT '',
              
          PRIMARY KEY (`FK_ID`, `FK_WORDS`, `S_TABLE`, `DIR`, `FILE`)
          )
          COLLATE=latin1_swedish_ci
          ENGINE
          =MyISAM
          ROW_FORMAT
          =DYNAMIC
          AVG_ROW_LENGTH
          =52


          CREATE TABLE 
          `searchdb_words_de` (
              `
          ID_WORDSBIGINT(10UNSIGNED NOT NULL  AUTO_INCREMENT,
              `
          wortCHAR(50NOT NULL  DEFAULT '',
              
          PRIMARY KEY (`ID_WORDS`),
              
          UNIQUE INDEX `wort` (`wort`)
          )
          COLLATE=latin1_swedish_ci
          ENGINE
          =MyISAM
          ROW_FORMAT
          =FIXED
          AUTO_INCREMENT
          =90244
          AVG_ROW_LENGTH
          =59 
          Die Struktur beinhaltet noch weitere Informationen die du ja löschen kannst.

          php-Entwicklung | ebiz-consult.de
          PHP-Webhosting für PHP Entwickler | ebiz-webhosting.de
          die PHP Marktplatz-Software | ebiz-trader.de

          Kommentar


          • #6
            Also die Abfrage die nicht nach relevanz sortiert wäre:

            PHP-Code:
            SELECT namebeschreibung FROM tabelle Where name LIKE %suchphrase% or beschreibung LIKE %suchphrase%  ORDER BY id
            So bekomme ich alle Treffer nach der ID sortiert ausgegeben. Mein Ziel ist es allerdings zuerst die Treffer in denen die Suchphrase im Namen gefunden wurde, und anschließend die Treffer in denen die Suchphrase in der beschreibung gefunden wurde, ausgeben zu lassen.

            Zuerst dachte ich an ein Abfrage in der Art:

            PHP-Code:
            SELECT namebeschreibung  
             FROM tabelle  
             Where  
             name LIKE 
            %suchphrase%  ORDER BY id  
             UNION ALL  
            SELECT name
            beschreibung  
             FROM tabelle  
             Where  
             beschreibung LIKE 
            %suchphrase%  ORDER BY id
            UNION ist ja eher zur Abfrage bei verschiedenen Tabellen gedacht.
            Und ein einheitliches Limit bekomme ich damit auch nicht hin, so wie ich das gesehen habe. Deswegen müsste ich eh die Ergebnisse in ein Array schreiben und mit diesem dann weiter arbeiten. Oder habe ich da etwas falsch verstanden?

            Kommentar


            • #7
              Zitat von Berni Beitrag anzeigen
              warum sammelst du nicht alle Wörter in einer Wortdatenbank

              In einer 2. Tabelle merkst du dir wie häufig ein Wort in einem Text vorgekommen ist. Die Häufigkeit ist gleich eine Größe für die Relevanz der Begriffe.
              Das käme so in etwas dem Selberbasteln der Fulltext-Search von MySQL gleich. Dass du diese auf eigene Faust performanter implementiert bekommst, als das bereits eingebaute Feature, glaube ich weniger.

              Zitat von Joxa Beitrag anzeigen
              UNION ist ja eher zur Abfrage bei verschiedenen Tabellen gedacht.
              Sagt wer?
              UNION ist dazu gedacht, zwei Abfrageergebnisse gleicher Struktur zu einem zusammenzufassen.
              Wo die "herkommen" oder wie selektiert wurde, ist UNION egal.

              Und ein einheitliches Limit bekomme ich damit auch nicht hin
              Was soll das jetzt wieder heissen? (Drück dich mal etwas präziser aus.)

              Mit LIMIT kann man bei UNION unterschiedliches bewirken - je nachdem, "wo" man es einsetzt.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Okay, klingt ja bis hierhin schon vielversprechend.

                Also Ich möchte die Suchergebnisse in der Reihenfolge:

                Treffer in Namen (nach id sortiert)
                Treffer in Beschreibung (nach id sortiert)
                evtl. noch eine 3. abgefragte Spalte nach id sortiert

                im Idealfall natürlich noch einmalig, denn es kann vorkommen das es einen Treffer in "Namen" gibt und dieser Eintrag auch ein Treffer bei der "Beschreibung" ist.

                Zusätzlich für eine Blätterfunktion der Ergebisse der kompletten Abfrage ein "Limit" mit Startwert und Anzahl der Datensätze der gesamten 2-3 Abfragen.

                Kam jetzt einigermaßen Verständlich rüber auf was ich hinaus will? ;o)

                Kommentar


                • #9
                  Dann ist UNION vermutlich besser.

                  Könnte man wie beschrieben mit IF zwar auch hinbekommen, aber k.A. ob das letztendlich effektiver wäre.
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    Ich lese Volltextsuche sehe aber keinen Fulltextindex.

                    Ich würde die Mysql Volltextsuche verwenden.

                    Kommentar

                    Lädt...
                    X