AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Relevanzsortierung bei Fulltext-Select
Thema durchsuchen
Ansicht
Themen-Optionen

Relevanzsortierung bei Fulltext-Select

Ein Thema von Codehunter · begonnen am 22. Mär 2017 · letzter Beitrag vom 23. Mär 2017
Antwort Antwort
nahpets
(Gast)

n/a Beiträge
 
#1

AW: Relevanzsortierung bei Fulltext-Select

  Alt 22. Mär 2017, 14:04
Helfen die Dir weiter? Which SQL query is better, MATCH AGAINST or LIKE?

Bei unvollständiger Eingabe seitens des Nutzers eventuell sowas?
SQL-Code:
SELECT name
FROM products_description
WHERE language_id=2
  AND MATCH(name) AGAINST ('optiset stand*IN NATURAL LANGUAGE MODE)
ORDER BY MATCH (name) AGAINST ('optiset stand*IN NATURAL LANGUAGE MODE) DESC
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.283 Beiträge
 
Delphi 12 Athens
 
#2

AW: Relevanzsortierung bei Fulltext-Select

  Alt 22. Mär 2017, 14:21
Bei unvollständiger Eingabe seitens des Nutzers eventuell sowas?
SQL-Code:
SELECT name
FROM products_description
WHERE language_id=2
  AND MATCH(name) AGAINST ('optiset stand*IN NATURAL LANGUAGE MODE)
ORDER BY MATCH (name) AGAINST ('optiset stand*IN NATURAL LANGUAGE MODE) DESC
Leider nein, das Ergebnis bleibt exakt identisch zum vorherigen:
Code:
Optiset E Standard   1.4053090810775757
Optiset E Entry   1.4053090810775757
Optiset E Advance plus   1.4053090810775757
Optiset E Memory   1.4053090810775757
Optiset E Memory   1.4053090810775757
Optiset E Entry   1.4053090810775757
Optiset E Basic   1.4053090810775757
Optiset E Basic   1.4053090810775757
Optiset E Basic   1.4053090810775757
Optiset E Basic   1.4053090810775757
Optiset E Standard   1.4053090810775757
Optiset E Standard   1.4053090810775757
Optiset E Standard   1.4053090810775757
Optiset E Standard   1.4053090810775757
Optiset E Advance   1.4053090810775757
Optiset E Advance   1.4053090810775757
Optiset E Advance plus   1.4053090810775757
Optiset E Advance plus   1.4053090810775757
Optiset E Advance Conference   1.4053090810775757
Optiset E Advance Conference   1.4053090810775757
Optiset E Memory   1.4053090810775757
Optiset E Memory   1.4053090810775757
Optiset E Memory   1.4053090810775757
Optiset E Key Module   1.4053090810775757
Optiset E Key Module   1.4053090810775757
EDIT: Du hast mich aber auf eine Idee gebracht:
Code:
SELECT name,
       MATCH(name) AGAINST ('+optiset +stand*' IN BOOLEAN MODE)
FROM products_description
WHERE language_id=2
  AND MATCH(name) AGAINST ('+optiset +stand*' IN BOOLEAN MODE)
ORDER BY MATCH (name) AGAINST ('+optiset +stand*' IN BOOLEAN MODE) DESC
ergibt:
Code:
Optiset E Standard   4.073927879333496
Optiset E Standard   4.073927879333496
Optiset E Standard   4.073927879333496
Optiset E Standard   4.073927879333496
Optiset E Standard   4.073927879333496
Optiset E Standard Gehäuse   4.073927879333496
Optiset E Standard Bodenwanne   4.073927879333496
Optiset E Standard Tastengitter Wahl Made in Germany   4.073927879333496
Optiset E Standard Tasten 8er Made in Germany   4.073927879333496
Optiset E Standard Plusminus Tasten Made in Germany   4.073927879333496
Optiset E Standard/Advance Tasten   4.073927879333496
Optiset E Standard/Advance Display Unterschale   4.073927879333496
Optiset E Standard/Advance Display Unterschale   4.073927879333496
Optiset E Standard/Advance Display Oberschale   4.073927879333496
Optiset E Standard/Advance Funktionstasten 8er-Block   4.073927879333496
Optiset E Standard/Advance Funktionstasten 4er-Block   4.073927879333496
Optiset E Standard/Advance/Memory Tasten Lautstärke (Plus und Minus)   4.073927879333496
Optiset E Standard/Advance Navigationstasten   4.073927879333496
Optiset E Standard/Advance Display Oberschale   4.073927879333496
Optiset E Standard/Advance Display Unterschale   4.073927879333496
Optiset E Standard/Advance Satz Tasten und Lichtleiter   4.073927879333496
Optiset E Standard   4.073927879333496
Sieht schon mal viel besser aus! Warum jetzt aber der Relevanzwert trotzdem bei allen identisch ist, obwohl das ORDER BY ganz offensichtlich anderes vermuten lässt, das erschließt sich mir jetzt auch nicht.

BTW: Wie hast du hier eigentlich das SQL-Syntax-Highlight gemacht? Das findet sich in meiner Editor-Toolbar gar nicht...
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter (22. Mär 2017 um 14:30 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: Relevanzsortierung bei Fulltext-Select

  Alt 22. Mär 2017, 14:34
code="sql" in eckigen Klammern.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.283 Beiträge
 
Delphi 12 Athens
 
#4

AW: Relevanzsortierung bei Fulltext-Select

  Alt 22. Mär 2017, 14:41
code="sql" in eckigen Klammern.
Ah, ein Osterei! Das trifft sich ja gut, ist bald wieder Ostern Spaß beiseite, ist das irgendwo dokumentiert, welche Highlighter ansprechbar sind?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: Relevanzsortierung bei Fulltext-Select

  Alt 22. Mär 2017, 14:48
Ostern ist hier genauer definiert: BBCode

Allerdings steht dort nicht genauer erläutert, was man bei Code noch so alles hinter das = schreiben kann. #Code
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Relevanzsortierung bei Fulltext-Select

  Alt 22. Mär 2017, 15:51
Ich find das ja etwas drollig. Hab mich noch nie mit diesen SQL Funktionen rumgeschlagen. Es erklärt im Grunde aber die besch.. Ausgabe in gefühlt jedem 1. Webshop mit sortierung nach "Relevanz"

Der erste wichtige Schritt ist naheliegend und bereits geschehen:
Bei unerklärlichen Sortierungen in der Ausgabe, das Sortierfeld mit ausgeben. Verblüffendes Ergebnis, naja nicht wirklich.

So wie es aussieht, kommt man recht bald zu der Erkenntnis, das Relevanz offenbar recht unterschiedlich bewertet wird.
Also Sortierkriterium selbst festlegen. Ich nehm bei sowas gern Levenshtein oder so, keine Ahnung ob es hier hilft, aber wäre mein Ansatz.

Im Übrigen wäre meine Frage auch bei dem Punkt "vollständige Eingabe" mal bitte zu erläutern, was das denn bitte sein soll?
Wann weiß ein Entwickler oder ein Stück Code, wann mein Suchbegriff vollständig ist?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Relevanzsortierung bei Fulltext-Select

  Alt 22. Mär 2017, 16:25

Da ich diese Funktion noch nie genutzt habe mal spekuliert
"Optiset" ist klar, muß man nicht diskutieren.
dann kommt in der DB ein "E" nach dem aber nicht gefragt wird, und schon passt die ganze Chose nicht mehr, der Rest ist nur noch geraten?

Interessant wären die nicht selektierten Daten.
Gibt es darunter "Optiset"?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Relevanzsortierung bei Fulltext-Select

  Alt 22. Mär 2017, 16:29
Im Übrigen wäre meine Frage auch bei dem Punkt "vollständige Eingabe" mal bitte zu erläutern, was das denn bitte sein soll?
Wann weiß ein Entwickler oder ein Stück Code, wann mein Suchbegriff vollständig ist?
Nie, aber er soll entscheiden, wie bei vollständiger bzw. unvollständiger Eingabe zu verfahren ist.
Dabei muss er noch anwenderabhängig entscheiden, was vollständig bzw. unvollständig ist.

Und Relevanz ist immer das, was der Anwender gerade als besonders wichtig erachtet.

Naja, Sortierung immer nach dem, was ich in Order By eingebe, nie nach irgendwas, was irgendwie in der Datenbank implementiert ist. Das ist immer ein bisserl wie Lotto.

Relevanz ist subjektiv. Eine objektive Sortierung nach subjektiven Kriterien erscheint mir nicht wirklich möglich.

Das ist wie bei der Suche mit Google und Co.

Die suchen immer nach dem, was sie meinen, was der Anwender gemeint haben könnte. So gut wie nie einfach nur nach dem, was man eingegeben hat. Und wenn man da mehrere Suchbegriffe mit und verknüpft haben möchte, dann machen die halt doch ein oder. Und auch nicht zwingend mit allen Suchbegriffen, sondern nur mit denen, von denen sie meinen, das sie relevant sein könnten.
Entsprechend schwierig ist es, effektiv nach bestimmten Begriffen / Begriffskombinationen zu suchen und nur die für einen persönlich relevanten Ergebnisse zu bekommen.

Zum obigen Beispiel:

Der Relevanzwert 4.073927879333496 bezieht sich wohl bei allen Zeilen der Ergebnismenge auf den Anteil dessen, der dem Suchbegriff entspricht. Bei allen ist "Optiset E Stand" identisch und resultiert wohl aus "+optiset +stand*". Diese beiden Werte kommen überall vor und damit sind sie gleich relevant. Von daher kann sich der Wert nicht unterscheiden. Woher sollte die Datenbank denn wissen, welche der auf "Optiset E Stand" folgenden Zeichenfolgen in der Ergebnismenge für den Anwender wichtiger sein könnten. Dazu müsste sie mehr Information über die Bedeutung des Datenbankinhaltes haben, also über Wissen verfügen.

Hier wäre, wenn man da eine weitere Sortierung haben will, eine Ergänzung des Order By zwingend erforderlich.

Also z. B.
SQL-Code:
SELECT name,
       MATCH(name) AGAINST ('+optiset +stand*IN BOOLEAN MODE)
FROM products_description
WHERE language_id=2
  AND MATCH(name) AGAINST ('+optiset +stand*IN BOOLEAN MODE)
ORDER BY MATCH (name) AGAINST ('+optiset +stand*IN BOOLEAN MODE) DESC, Name, levenshtein(name, 'optiset stand');
Wobei mir bei einer unvollständigen Eingabe, wie in diesem Beispiel, die Levenshtein-Distanz nicht wirklich sinnvoll erscheint.

(Die Levenshtein-Distanz in MySQL)

Oder die Tabelle müsste eine Relevanzspalte enthalten, in der vom Nutzer ein Wert für die Relevanz hinterlegt wird. Gleicher Wert = gleiche Relevanz. Kleinerer Wert = kleinere Relevanz. Diese Spalte muss dann mit ins Order By ... Relevanzspalte desc.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz