2009-03-05 4 views
5

Estoy buscando la solución óptima para la coincidencia de palabras clave entre diferentes registros en la base de datos. Es un problema clásico, he encontrado preguntas similares, pero nada concretamente.¿Cuál es la solución óptima para la coincidencia de etiquetas/palabras clave?

Lo he hecho con búsquedas de texto completo, uniones y subconsultas, tablas temporales, ... así que realmente me gustaría ver cómo ustedes están resolviendo un problema tan común.

Entonces, digamos que tengo dos tablas; Products y Keywords y están vinculados con la tercera tabla, Products_Keywords en una relación clásica de muchos a muchos.

Si muestro un registro Product en la página y me gustaría mostrar los primeros n productos relacionados, ¿cuál sería la mejor opción?

Debemos tener en cuenta que los registros pueden compartir varias palabras clave y este hecho debe determinar el orden del producto relacionado principal.

Estoy abierto para otras ideas también, pero T-SQL sería una solución preferible debido a los motivos de rendimiento.

+0

Alerta de pedantería: algo no puede ser "lo más óptimo posible". Es óptimo, también conocido como "mejor", o no lo es. ;-) – nekomatic

+0

Corregido :) – muerte

Respuesta

0

Bueno, tal vez algo así como el 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)*/ 

Ahora tengo serias dudas de que es una instrucción SQL óptima, pero debe hacer el trabajo. Sin embargo, no puedo verificarlo, ya que lo escribí desde cero sin tablas de respaldo reales, ni datos para evaluar.

+0

si quieres palabras clave ponderadas para arriba y eliges tus pesos para que sean un número entre 0> x> = 1, puedes establecer el rango en (contar (related.productId) * (suma (pk.weight)/sum (pk.peso) +1)) como rango o [C * (w/w + 1) = rango] donde C es el recuento yw es el peso sumado. –

3

Mi primer disparo sería algo así como:

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 

La unión de Product_Keywords a Product_Keywords (PK2 a PK1) podría ser peligroso, así que no puedo hablar con el rendimiento. Aquí es donde comenzaría y luego miraría la optimización.

Una cosa a tener en cuenta, como continuación del comentario de Assaf, es que podría agregar un "peso" a las Palabras claves de productos y SUM (PK1.weight) + SUM (PK2.peso) para la clasificación. Solo un pensamiento.

EDITAR: Para elaborar sobre la ponderación ... puede decidir que desea permitir que las palabras clave sean ponderadas. Sin embargo, el método real utilizado para determinar la ponderación sería una decisión comercial, así que realmente no puedo darle demasiada orientación allí.

Como un ejemplo, esta pregunta es sobre "programación", "coincidencia de palabras clave" y "SQL". La programación es bastante genérica, por lo que si dos preguntas tuvieran eso en común, podría no significar que están relacionadas, así que tal vez solo ponderes como 1. SQL es un poco más específico, por lo que puedes ponderar como 5. Palabra clave coincidente es tanto el foco principal de la pregunta Y es bastante específico, por lo que puede ponderar eso con un 10.

Esto es solo un ejemplo, por supuesto, y como dije, la determinación exacta de los pesos y la puntuación depende del negocio específico. Puede decidir que igualar el número de palabras clave es más importante que los pesos, por lo que quizás la ponderación solo se utilice como desempate, etc. HTH.

+0

¿Puede por favor elaborar un poco sobre el concepto de peso? ¿Cómo debo ponderar las palabras clave? – muerte

Cuestiones relacionadas