T-SQL - 如何更快地使用多个LIKE子句进行SELECT查询?

sr2*_*r28 7 sql t-sql sql-server

我有一个搜索功能,看起来像这样的新闻文章(包含超过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 
Run Code Online (Sandbox Code Playgroud)

此查询旨在提取与可持续发展相关的前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
Run Code Online (Sandbox Code Playgroud)

这似乎对性能非常有效,但似乎有时会带回一些重复的文章,其中一个搜索词出现在正文和标题中(通常就是这种情况).我尝试使用'SELECT DISTINCT TOP 5*'这个词,但是这给了我一个错误,'ntext数据类型不能被选为DISTINCT,因为它不具有可比性'.是不是在没有进行2次单独搜索和使用UNION的情况下阻止重复这一点?

SWe*_*eko 1

由于您在多个单词上获得了多次点击,因此您可以使用选定的 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
Run Code Online (Sandbox Code Playgroud)

它仍然应该相当快(与原始查询相比)并且无重复。

(正如在 Rawheiser 的回复中,假设 ID 字段确实存在:))