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的情况下阻止重复这一点?
由于您在多个单词上获得了多次点击,因此您可以使用选定的 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 字段确实存在:))
| 归档时间: |
|
| 查看次数: |
15388 次 |
| 最近记录: |