2009-03-05 15 views
5

Sto cercando la soluzione ottimale per la corrispondenza delle parole chiave tra diversi record nel database. È un problema classico, ho trovato domande simili, ma niente di concreto.Qual è la soluzione ottimale per la corrispondenza di tag/parole chiave?

L'ho fatto con ricerche full-text, join e sottoquery, tabelle temporanee, ... quindi mi piacerebbe davvero vedere come voi ragazzi state risolvendo un problema così comune.

Quindi, diciamo che ho due tabelle; Products e Keywords e sono collegati con la terza tabella, Products_Keywords in una classica relazione molti-a-molti.

Se mostro un record Product nella pagina e vorrei mostrare i migliori prodotti correlati n, quale sarebbe l'opzione migliore?

Dobbiamo tenere in considerazione che i record potrebbero condividere più parole chiave e questo fatto dovrebbe determinare l'ordine del prodotto correlato principale.

Sono aperto anche ad altre idee, ma T-SQL sarebbe la soluzione preferibile per motivi di prestazioni.

+0

Avviso pedanteria: qualcosa non può essere "il più ottimale". È ottimale, anche noto come "migliore" o non lo è. ;-) – nekomatic

+0

Sono corretto :) – muerte

risposta

0

Beh, forse qualcosa di simile alla 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)*/ 

Ora dubito seriamente che è una dichiarazione di sql ottimale, ma dovrebbe ottenere il lavoro fatto. Non riesco a verificarlo anche se l'ho appena scritto da zero senza tabelle di supporto reali o dati da testare.

+0

se volevi parole chiave ponderate per sopra e scegli i tuoi pesi per essere un numero compreso tra 0> x> = 1, puoi impostare il rango su (conteggio (related.productId) * (somma (pk.weight)/sum (pk.peso) + 1)) come rank o [C * (w/w + 1) = rank] dove C è il conteggio e w è il peso sommato. –

3

Il mio primo colpo sarebbe qualcosa di simile:

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 

L'unione di Product_Keywords a Product_Keywords (PK2 a PK1) potrebbe essere di massima, quindi non posso parlare con le prestazioni. Questo è dove vorrei iniziare però e quindi guardare l'ottimizzazione.

Una cosa da considerare, come follow-up del commento di Assaf, è che è possibile aggiungere un "peso" a Product_Keywords e SUM (PK1.weight) + SUM (PK2.weight) per il posizionamento. Solo un pensiero.

MODIFICA: per elaborare la ponderazione ... è possibile decidere di consentire la ponderazione delle parole chiave. Il metodo effettivo utilizzato per determinare la ponderazione sarebbe una decisione commerciale, quindi non posso davvero darti troppa guida lì.

Ad esempio, questa domanda riguarda "programmazione", "corrispondenza delle parole chiave" e "SQL". La programmazione è piuttosto generica, quindi se due domande avessero in comune ciò potrebbe non significare che siano così correlate, quindi forse la peserai solo come 1. SQL è un po 'più specifico, quindi potresti pesare come 5. Corrispondenza di parole chiave è l'obiettivo principale della domanda ED è piuttosto specifico, quindi potresti pesarlo con un 10.

Questo è solo un esempio, ovviamente, e come ho detto, la determinazione esatta dei pesi e il modo con cui si segna dipende dal business specifico. Potresti decidere che la corrispondenza del numero di parole chiave sia più importante dei pesi, quindi forse la ponderazione viene utilizzata solo come tie-breaker, ecc. HTH.

+0

Puoi approfondire un po 'il concetto di peso? Come devo pesare le parole chiave? – muerte

Problemi correlati