Relevanz von Suchergebnissen

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

  • piratos
    Guest replied
    Ich lese Volltextsuche sehe aber keinen Fulltextindex.

    Ich würde die Mysql Volltextsuche verwenden.

    Leave a comment:


  • wahsaga
    replied
    Dann ist UNION vermutlich besser.

    Könnte man wie beschrieben mit IF zwar auch hinbekommen, aber k.A. ob das letztendlich effektiver wäre.

    Leave a comment:


  • Joxa
    replied
    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)

    Leave a comment:


  • wahsaga
    replied
    Originally posted by Berni View Post
    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.

    Originally posted by Joxa View Post
    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.

    Leave a comment:


  • Joxa
    replied
    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?

    Leave a comment:


  • admin
    replied
    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.

    Leave a comment:


  • wahsaga
    replied
    Originally posted by Joxa View Post
    hm, das scheint relativ performancelastig zu sein.
    Wieso?

    Wie sehen deine Vergleiche aus? Eher simpel, oder beinhalten die komplizierte Zeichenkettenoperation/RegExp ...?

    Leave a comment:


  • Joxa
    replied
    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.

    Leave a comment:


  • wahsaga
    replied
    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.

    Leave a comment:


  • Joxa
    started a topic Relevanz von Suchergebnissen

    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?
Working...
X