Мой первый выстрел будет примерно таким:
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
Соединение Product_Keywords с Product_Keywords (от PK2 до PK1) может быть грубым, поэтому я не могу говорить о производительности. Это то место, где я бы начал, а затем посмотрел на оптимизацию.
В качестве дополнения к комментарию Ассафа следует учесть, что вы можете добавить «вес» в Product_Keywords и SUM (PK1.weight) + SUM (PK2.weight) для ранжирования. Просто мысль.
РЕДАКТИРОВАТЬ: Чтобы уточнить вес ... вы можете решить, что хотите разрешить взвешивание ключевых слов. Фактический метод, используемый для определения веса, был бы деловым решением, поэтому я не могу дать вам слишком много указаний там.
В качестве примера, этот вопрос касается «программирования», «соответствия ключевых слов» и «SQL». Программирование довольно общее, так что если два общих вопроса имеют это общее, это все равно может не означать, что они связаны между собой, поэтому, возможно, вы только взвесите его как 1. SQL немного более конкретен, так что вы можете взвесить как 5. Соответствие ключевых слов это одновременно основной вопрос, и он довольно специфичен, так что вы можете взвесить это с 10.
Это всего лишь пример, и, как я уже сказал, точное определение весов, а также то, как вы их набрали, зависят от конкретного бизнеса. Вы можете решить, что соответствие количеству ключевых слов важнее, чем весовые коэффициенты, поэтому, возможно, весовой коэффициент используется только в качестве разрыва связи и т. Д. HTH.