Volltextsuche Relevanz beeinflussen

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

  • Volltextsuche Relevanz beeinflussen

    Hi zusammen,

    ich habe Probleme die Relevanz bei einer Volltextsuche in mysql zu beeinflussen.

    Die Query ist recht lang, deshalb mal ein vereinfachtes Beispiel:
    Name: "Jan Bäcker"
    Beruf: "Maurer"
    Profil: "Ich bin Maurer und liebe es"

    diese 3 Spalten werden in einem Index zusammengefasst. Bei einer Suche nach "Jan Bäcker" ergibt sich dann ab und an mal das Problem, dass Sachen aus (in diesem Fall ) dem Profil höher gewichtet werden... wenn nu jemand Bäcker von Beruf ist und im Profil auch Bäcker stehen hat, ist dieser in der in der Ergebnisliste höher angesiedelt als halt den Jan Bäcker, den wir eigentlich suchten.

    Was ich nun möchte ist, das die erste Spalte (in diesem Beispiel der Name) eine höhere Relevanz erhält, als der Rest... und das krieg ich partout nicht gebacken

    Habs z.B. schon so probiert:
    Code:
    SELECT *, MATCH ( 1.5*`Name` , `Beruf`, `Profil` ) AGAINST ("Jan Bäcker") AS score 
    FROM Leute WHERE MATCH ( `Name` , `Beruf`, `Profil` ) AGAINST ("Jan Bäcker") 
    ORDER BY score;
    aber damit bekomm ich nur ein fröhliches "You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near..."

    Hat jemand eine Idee? Was mach ich hier falsch...

    Danke vorab schon einmal!

  • #2
    Re: Volltextsuche Relevanz beeinflussen

    Was du falsch machst? Du multiplizierst einen Spaltennamen. Was soll dabei herauskommen, 1.5*Name = NameNa oder was?

    Versuche es mal so:
    SELECT *,
    MATCH (Name) AGAINST ("Jan Bäcker") AS score1,
    MATCH (Name, Beruf, Profil) AGAINST ("Jan Bäcker") AS score2,
    FROM Leute
    WHERE MATCH (Name, Beruf, Profil) AGAINST ("Jan Bäcker")
    ORDER BY score1, score2

    Kommentar


    • #3
      Ne... ich multipliziere den Relevanzwert eines Inhalts der Spalte mit dem Namen "Name", der in score gespeichert wird.

      Dein Vorschlag wäre ein Ansatz, aber liefert leider noch schlechtere Suchergebnisse in einigen Test

      Kommentar


      • #4
        Original geschrieben von sunbringer
        multipliziere den Relevanzwert eines Inhalts der Spalte mit dem Namen "Name", der in score gespeichert wird
        Nein, das wäre dieses:
        1.5 * (MATCH (Name) AGAINST ("Jan Bäcker")) AS score

        Und genau aus diesem Grund habe ich diesen Ansatz gepostet. Er erlaubt dir die Gewichtung von Treffern in bestimmten Spalten.

        Wenn du es nur 1 zu 1 übernimmst, kann das natürlich zu schlechteren Ergebnissen führen. Aber mit der eben nochmal gezeigten Möglichkeit der Gewichtung und ORDER BY solltest du den Ansatz doch leicht auf dein Problem anwenden können.

        Kommentar


        • #5
          jo, habs auhc grade gefunden

          auf http://dev.mysql.com/doc/connector/j...t-boolean.html gabs folgenden snipped
          Code:
          SELECT *, ( (1.3 * (MATCH(title) AGAINST ('+term +term2' IN BOOLEAN MODE))) + (0.6 * (MATCH(text) AGAINST ('+term +term2' IN BOOLEAN MODE))) ) AS relevance FROM [table_name] WHERE ( MATCH(title,text) AGAINST ('+term +term2' IN BOOLEAN MODE) ) HAVING relevance > 0 ORDER BY relevance DESC;
          der hats gebracht Deine Post noch dazu und schwupp, haben wir das richtige Ergebnise

          Danke dir, nu muss ich nur noch an der Gewichtung pfeilen, dann haben wirs... *schwitz* Meine Query hat nun ohne searchterm knappe 250 Zeichen... oh hilfe...

          Kommentar

          Lädt...
          X