Suche mit Score - schnellere Lsg als UNION gesucht

Hallo,

ich möchte in meiner Tabelle bestehend aus Spalten id, name, beschreibung suchen, und abh. davon in welcher Spalte gefunden wurde, dem Suchergebnis einen Score vergeben. So habe ich es bisher gelöst:

(select *, 100 as score from t where name like ‚$keyword‘)
UNION DISTINCT
(select *, 90 as score from t where name like ‚%$keyword%‘)
UNION DISTINCT
(select *, 60 as score from t where description like ‚%$keyword%‘)

So funktioniert es schon mal. Nun dauert jede Abfrage ihre Zeit, und dann auch noch UNION DISTINCT… Geht das noch schneller? Kann man in einer einzigen SELECT-Abfrage eine derartige Bewertung durchführen?

Hallo Multiplexor,

zumindestens ein SELECT kannst Du Dir sparen (wenn es auch gerade das schnellste ist)

select \*, 100 as score 
 from t 
 where name like '$keyword'
 UNION DISTINCT
select \*, 90 as score 
 from t 
 where name like '%$keyword%'
 UNION DISTINCT
select \*, 60 as score 
 from t 
 where description like '%$keyword%'

indem Du nur nach %$keyword% abfragst und den Score um 10 erhöhst, wenn die Länge von Name identisch mit der Länge vom Suchbegriff ist. Also aus dem Bauch heraus

select \*, 
 90+case when length(name)=length($keyword) 
 then 10
 else 0
 as score 
 from t 
 where name like '%$keyword%'
 UNION 
select \*, 60 as score 
 from t 
 where description like '%$keyword%'

Das DISTINCT kannst Du Dir übrigens sparen, da durch den Score immer unterschiedliche Sätze entstehen, auch wenn der Datensatz im Namen und in der Description der gleichen String beinhaltet.

Wenn die Tabelle sehr groß ist könnte man den Trick auch mit einem SELECT und einem

 where name like '%$keyword%'
 or description like '%$keyword%'

ansetzen, dies spart dann einige I/O benötigt dann aber etwas mehr CPU. Nebenbei löst es Dein Problem der Doppelanzeige :smile:.

MfG Georg V.