Алгоритм поиска по ключевому слову SQL: этот SQL выполняет последовательный поиск, как выполнить индексированный поиск? - PullRequest
0 голосов
/ 02 декабря 2010

У нас есть три таблицы для хранения наших продуктов и ключевых слов:

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, несомненно, будут оценены.

Ответы [ 2 ]

2 голосов
/ 02 декабря 2010

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

Вам следует изучить использование полнотекстовой индексации SQL Server.contains, вероятно, будет намного быстрее и гораздо более мощным для частичных совпадений природы, которую вы, похоже, делаете.

1 голос
/ 02 декабря 2010

хорошо, вы могли бы реализовать полнотекстовый индекс для этого столбца, который помог бы повысить производительность операторов select, но ухудшил бы производительность трех других операций CRUD, так как индекс должен был бы обновляться для каждой операции.Тогда я считаю, что вы будете использовать КОНТЕЙН или какое-либо другое подобное ключевое слово.Вот еще немного информации .

...