Какое оптимальное решение для соответствия тега / ключевого слова? - PullRequest
5 голосов
/ 05 марта 2009

Я ищу оптимальное решение для соответствия ключевых слов между различными записями в базе данных. Это классическая проблема, я нашел похожие вопросы, но ничего конкретного.

Я сделал это с помощью полнотекстового поиска, объединений и подзапросов, временных таблиц ... так что мне бы очень хотелось посмотреть, как вы, ребята, решаете такую ​​распространенную проблему.

Итак, допустим, у меня есть две таблицы; Products и Keywords, и они связаны с третьей таблицей Products_Keywords в классических отношениях «многие ко многим».

Если я покажу одну Product запись на странице и захочу показать топ n сопутствующих товаров, что будет лучшим вариантом?

Мы должны принять во внимание, что записи могут иметь несколько ключевых слов, и этот факт должен определять порядок наиболее релевантного продукта.

Я открыт и для других идей, но T-SQL был бы предпочтительным решением из-за соображений производительности.

Ответы [ 2 ]

3 голосов
/ 05 марта 2009

Мой первый выстрел будет примерно таким:

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.

0 голосов
/ 05 марта 2009

Ну, может быть, что-то вроде следующего:

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)*/

Теперь я серьезно сомневаюсь, что это оптимальный SQL-оператор, но он должен выполнить свою работу. Я не могу проверить это, хотя, поскольку я только написал это с нуля без фактических таблиц поддержки или данных для проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...