2009-06-01 110 views
6

我正试图实现类似于Stackoverflow上的“相关问题”的功能。什么是SQL用于执行类似于“Stackoverflow上相关问题”的搜索

如何编写SQL语句来搜索我的数据库的标题和摘要字段以获取类似问题?

如果我的问题是:“什么是SQL用于执行搜索类似”Stackoverflow相关问题“。

我能想到的步骤是;

  1. 带引号
  2. 拆分句子成词的数组和运行上的每个字一个SQL搜索。

如果我这样做,我猜我不会得到任何有意义的结果。我不确定是否在服务器上启用了全文搜索,所以我没有使用它。使用全文搜索会有优势吗?

我发现了一个类似的问题,但没有答案:similar question

使用SQL 2005

回答

1

在我的SQL 2005服务器上启用全文搜索后,我正在使用以下存储过程来搜索文本。

ALTER PROCEDURE [dbo].[GetSimilarIssues] 
(
@InputSearch varchar(255) 
) 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

DECLARE @SearchText varchar(500); 

SELECT @SearchText = '"' + @InputSearch + '*"' 

SELECT PostId, Summary, [Description], 
Created 
FROM Issue 

WHERE FREETEXT (Summary, @SearchText); 
END 
1

他们可能涉及基于被添加到问题标签...

+4

当您输入标题而不是标签时,弹出相关问题对话框。 – 2009-06-01 22:14:37

+0

确实,他们在标题中搜索“独特”的单词。他们可能会过滤掉诸如“how”,“the”,“what”等词,并在其他标题中搜索其余词,而不考虑词的位置。但他们也可能会在标签中搜索这些独特的词,这些匹配可能在搜索结果中评分较高。 – Ropstah 2009-06-01 22:40:25

-4

的SQL非常好可能只是“选择*从问题;”。我发现很难想象用SQL查找类似问题的算法。

+0

的确如此,但更有建设性的东西在这里会有所帮助。正如其他答案所证明的那样,全文引擎确实可以帮助完成这项工作。 – 2009-08-06 20:21:54

0

我敢肯定,基于与每个帖子相关联的标签实现该功能将是最有效的。

+1

除了在输入标签之前进行搜索。 – 2009-06-01 22:28:19

0

这可能是通过使用与文字/短语匹配的全文搜索来完成的。我已经在MySQL和SQL Server中使用它,并具有开箱即用的功能。

你可以找到更多关于MySQL的全文搜索:

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

或者只是谷歌的全文搜索,你会发现很多信息。

0

它根据您输入的标题查找关键字,查询其他问题的标题和内容。在Lucene(或类似的)中,然后在关系数据库中做起来可能更容易(也更合适)。

0

我想说这可能是一个关于问题标题和问题内容和答案的全文搜索,以及使用您输入的单个单词(而不是整个标题)。然后,使用全文的排名功能,显示排名最高的排名前10位的问题。

正如tydok指出的,它看起来像他们正在使用全文搜索(我无法想象任何其他方式)。

以下是MSDN reference on Full-Text Searching,指出所使用的特定查询可能不会发生。

7

看看这个podcast

我们的一个主要性能 优化为“相关 问题”查询去除顶部 万最常用英语词典 单词提交查询到SQL Server之前(通过谷歌搜索确定) 2008全文引擎。这是 一旦你删除顶部10k 英文字典单词,大多数 剩下的是多么少的。这有助于 限制和缩小返回的结果, 这使查询显着 更快。