У нас есть три таблицы для хранения наших продуктов и ключевых слов:
Product {int ID, string name, ...}
ProductKeyword {int productID, int keywordID}
Keyword {int ID, string keyword}
Этот код SQL возвращает наиболее релевантные товары наименее релевантным товарам с ключевыми словами, такими как критерии поиска пользователей. searchWordTable - это таблица поисковых слов. @keywordCount
- количество поисковых слов. Это возвращает все продукты, имеющие одно или несколько ключевых слов, упорядоченные по количеству ключевых слов, найденных для каждого продукта.
select productid, productname, count(*) * 1 / @keywordCount as percentRelevant
from (select keyword, productid, productname
from product
join productkeyword on ...
join keyword on ...
join searchWordTable on searchwordtable.keyword like
'%' + keyword.keyword + '%') K -- like join aweful
group by productid, productname
order by percentRelevant desc -- Most relevant first
Проблема в том, что это последовательный поиск, сравнивающий каждое имеющееся у нас ключевое слово. Это не плохо, но поиск может занять минуту с миллионами записей.
Как можно переписать запрос, чтобы не использовать like
, надеяться использовать индексированный поиск и получить похожие результаты? Они используют like
для получения частичных совпадений, например, «кость» в «бескостный».
Ссылки на лучшие алгоритмы SQL, несомненно, будут оценены.