Wir haben drei Tabellen unsere Produkte und Keywords zu halten:SQL-Schlüsselwort-Suchalgorithmus: Dieses SQL führt eine sequenzielle Suche aus, wie wird eine indizierte Suche durchgeführt?
Product {int ID, string name, ...}
ProductKeyword {int productID, int keywordID}
Keyword {int ID, string keyword}
Dieser SQL-Code gibt die wichtigsten Produkte an die am wenigsten relevanten Produkte Schlüsselwörter wie die Benutzer Kriterien suchen zu müssen. searchWordTable ist eine Tabelle mit Suchbegriffen. @keywordCount
ist eine Zählung der Suchbegriffe. Dadurch werden alle Produkte zurückgegeben, die ein oder mehrere Keywords enthalten, sortiert nach der Anzahl der Keywords, die für jedes Produkt gefunden wurden.
select productid, productname, count(*) * 1/@keywordCount as percentRelevant
from (select keyword, productid, productname
from product
join productkeyword on ...
join keyword on ...
join searchWordTable on searchwordtable.keyword like
'%' + keyword.keyword + '%') K -- like join aweful
group by productid, productname
order by percentRelevant desc -- Most relevant first
Das Problem ist, dass es eine sequenzielle Suche ist, die jedes Schlüsselwort vergleicht, das wir haben. Es ist nicht schlecht, aber Suchvorgänge können eine Minute mit einer Million Datensätze dauern.
Wie könnte ich die Abfrage neu schreiben, um like
nicht zu verwenden, hoffentlich eine indexierte Suche verwenden und ähnliche Ergebnisse erhalten? Sie verwenden like
, um teilweise Übereinstimmungen zu erhalten, z. B. "bone" in "knochenlos".
Links zu besseren SQL-Algorithmen würden sicherlich geschätzt werden.
In Ihrem Beispiel ("bone" in "knochenlos") könnten Sie das erste "%" weglassen und - bang - ein Index kann verwendet werden. – AndreKR
Das ist eine sehr gute Idee. Wenn wir unsere Keywords auf einzelne Wörter beschränken könnten, würde das ziemlich gut funktionieren. Wir haben ähnliche Keywords wie 'Kelloggs Corn Flakes'. –