我有一个看起来像这样的新闻文章的搜索功能(包含超过 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 的情况下阻止它带回重复项?