2009-03-05 6 views
5

Ich bin auf der Suche nach der optimalen Lösung für den Keyword-Abgleich zwischen verschiedenen Datensätzen in der Datenbank. Es ist ein klassisches Problem, ich habe ähnliche Fragen gefunden, aber nichts Konkretes.Was ist die optimale Lösung für den Tag/Keyword-Abgleich?

Ich habe es mit Volltextsuchen, Joins und Unterabfragen, temporäre Tabellen, ... getan, also würde ich wirklich gerne sehen, wie Sie ein solches gemeinsames Problem lösen.

Also sagen wir, ich habe zwei Tabellen; Products und Keywords und sie sind mit der dritten Tabelle, Products_Keywords in einer klassischen Viele-zu-viele-Beziehung verknüpft.

Wenn ich eine Product Aufzeichnung auf der Seite zeige und möchte n ähnliche Produkte zeigen, was wäre die beste Option?

Wir sollten berücksichtigen, dass Datensätze mehrere Schlüsselwörter teilen können, und diese Tatsache sollte die Reihenfolge des obersten verwandten Produkts bestimmen.

Ich bin offen für andere Ideen, aber T-SQL wäre aus Gründen der Leistung vorzuziehen Lösung.

+0

Pedanteriewarnung: etwas kann nicht "optimal" sein. Es ist entweder optimal, auch bekannt als "best" oder nicht. ;-) – nekomatic

+0

Ich stehe behoben :) – muerte

Antwort

0

Nun, vielleicht so etwas wie der follwing:

select p.productId, p.name, r.rank 
from products p inner join (
/* this inner select should bring in only products that have at least one keyword 
=> shared with the requested product, and will count the actual number shared (for ranking)*/ 
    select related.productId, count(related.productId) as rank 
    from 
     products_keywords related inner join 
     products_keywords pk ON (pk.productId = @productId AND related.keywordId = pk.keywordId) 
    where related.productId <> @productId 
    group by related.productId 
) r on p.productId = r.productId 
order by r.rank DESC /* added DESC (not in orignal solution, but needed to put higher ranked on top)*/ 

nun ernsthaft Zweifel ich, das ist eine optimale SQL-Anweisung, aber es sollte den Job erledigen. Ich kann es jedoch nicht überprüfen, da ich es nur von Grund auf neu geschrieben habe, ohne tatsächliche Hintergrundtabellen oder Daten zum Testen.

+0

Wenn du gewichtete Keywords für oben haben willst und deine Gewichte als Zahl zwischen 0> x> = 1 wählst, kannst du den Rang auf (count (related.productId) * (sum (pk.weight)/Summe (pk.Gewicht) + 1)) als Rang oder [C * (w/w + 1) = Rang] wobei C die Zählung und w das summierte Gewicht ist. –

3

Mein erster Schuss wäre so etwas wie:

SELECT 
    P.product_id, 
    COUNT(*) 
FROM 
    Product_Keywords PK1 
INNER JOIN Product_Keywords PK2 ON 
    PK2.keyword_id = PK1.keyword_id 
INNER JOIN Products P ON 
    P.product_id = PK.product_id 
WHERE 
    PK1.product_id = @product_id 
GROUP BY 
    P.product_id 
ORDER BY 
    COUNT(*) DESC 

Die zu Product_Keywords (PK2 zu PK1) von Product_Keywords kommen könnte rau sein, so kann ich nicht auf die Leistung sprechen. Hier würde ich aber anfangen und dann auf Optimierung schauen.

Eine Sache zu beachten, als Follow-up zu Assafs Kommentar ist, dass Sie eine "Gewichtung" zu Product_Keywords und SUM (PK1.weight) + SUM (PK2.weight) für das Ranking hinzufügen können. Nur ein Gedanke.

BEARBEITEN: Um die Gewichtung zu erläutern ... können Sie entscheiden, dass Sie Keywords gewichten lassen möchten. Die tatsächliche Methode, die zur Bestimmung der Gewichtung verwendet wird, wäre jedoch eine Geschäftsentscheidung, daher kann ich Ihnen dort nicht wirklich zu viel Orientierung geben.

Diese Frage bezieht sich als Beispiel auf "Programmierung", "Schlüsselwortabgleich" und "SQL". Die Programmierung ist ziemlich generisch, also wenn zwei Fragen das gemeinsam haben, bedeutet das vielleicht noch nicht, dass sie so verwandt sind. Vielleicht gewichtet man sie nur als 1. SQL ist etwas genauer, so dass man als 5. Keyword-Matching gewichten kann ist sowohl der Hauptfokus der Frage UND es ist ziemlich spezifisch, so könnte man das Gewicht mit einem 10.

Dies ist nur ein Beispiel natürlich und wie gesagt, die genaue Bestimmung der Gewichte sowie wie Sie punkten es hängt von dem spezifischen Geschäft ab. Sie könnten entscheiden, dass die Übereinstimmung der Anzahl von Schlüsselwörtern wichtiger ist als die Gewichtung, so dass die Gewichtung nur als Tie-Breaker usw. verwendet wird. HTH.

+0

Können Sie bitte etwas über das Gewichtskonzept ausarbeiten? Wie sollte ich Keywords gewichten? – muerte

Verwandte Themen