我有一个新闻搜索功能,看起来像这样(包含5个以上的搜索项):
SELECT TOP 5 * FROM NewsArticles WHERE (headline LIKE '% sustainable %'OR headline LIKE '% sustainability %' OR headline LIKE '% conservation %' OR headline LIKE '% environmental % OR headline LIKE '% environmentally %') OR (body LIKE '% sustainable %'OR body LIKE '% sustainability %' OR body LIKE '% conservation %' OR body LIKE '% environmental % OR body LIKE '% environmentally %') ORDER BY publishDate DESC
此查询旨在提取与可持续性相关的前5条新闻报道,并位于我的主要可持续性主页上。但是,它需要一段时间才能运行,并且页面加载速度很慢。因此,我正在寻找加快速度的方法。拥有如此多的LIKE子句似乎很麻烦,因此我尝试使用JOIN这样的操作:
CREATE TABLE #SearchItem (Search varchar(255)) INSERT INTO #SearchItem VALUES ('sustainable'), ('sustainability'), ('conservation'), ('environmental'), ('environmentally') SELECT TOP 5 * FROM NewsArticles as n JOIN #SearchItem as s ON n.headline COLLATE DATABASE_DEFAULT LIKE '% ' + s.Search + ' %' OR n.body COLLATE DATABASE_DEFAULT LIKE '% ' + s.Search + ' %' ORDER BY n.publishDate DESC
这似乎对性能非常有效,但似乎有时会带回重复的文章,其中在正文和标题中都出现一个搜索词(通常是这种情况)。我已经尝试过使用“ SELECT DISTINCT TOP 5 *”这个词,但这给我一个错误:“ ntext数据类型不能被选择为DISTINCT,因为它不具有可比性”。是否可以阻止它在不进行2次单独搜索且使用UNION的情况下带回重复项?
由于您在多个单词上多次点击,因此可以将所选ID用作实际选择文章的过滤器:
Select TOP 5 * from NewsArticles where ID in (SELECT ID FROM NewsArticles as n JOIN #SearchItem as s ON n.headline COLLATE DATABASE_DEFAULT LIKE '% ' + s.Search + ' %' OR n.body COLLATE DATABASE_DEFAULT LIKE '% ' + s.Search + ' %' ) ORDER BY publishDate DESC
它仍应相当快(与原始查询相比)且无重复。
(如Rawheiser的答复中,假设ID字段实际上存在:)