如何通过存储过程处理“关键字搜索”?

时间:2011-09-15 12:54:52

标签: sql-server-2005 tsql stored-procedures

我正在创建一个自助常见问题类型的应用程序,其中一个要求是最终用户必须能够搜索FAQ主题。我有三种注释模型,下面列出了相关的(即可搜索的)列:

Topic: Name, Description
Question: Name, Answer
Problem: Name, Solution

所有三个表都通过TopicID列链接到主题。想法是提供单个文本框,用户可以在其中输入搜索查询,例如句子(例如“我如何执行X”)或短语(例如“执行X”或“执行X”),并提供所有主题/问题/问题,包含他们在名称或说明/答案/解决方案字段中输入的任何单词;该模型只会搜索那些列,我不必担心过滤掉像“如何”这样的常用词语(这会很好但不是必需的,因为它不是完全匹配而是模糊匹配)。

出于我无法控制的原因,我必须使用存储过程。我的问题是如何处理这样的搜索最合适的方法;我已经看到了关于多列的类似问题,但实际上没有可变数量的列,每个表总是有两列实际可搜索。问题是,从理论上讲,搜索查询几乎可以是任何东西 - 句子,短语,逗号分隔的术语列表(例如“x,y,z”),所以我必须将搜索术语分成组件(例如,在空格上拆分),然后搜索每一列的每对列?在SQL Server中这样做相当容易吗?替代方案,有点麻烦,只是将所有数据拉回来,然后拆分查询并在服务器端代码中过滤结果,因为不应该 输入许多项目,但是做这样的事我会觉得有点脏; - )

1 个答案:

答案 0 :(得分:1)

建议creating a new Full Text Catalog,并将表和列分配给该目录。确保您的目录以适当的频率更新,以满足您的需求。

然后,您可以使用FREETEXT谓词查询此目录。听起来你需要匹配像'ing'这样的后缀,所以在这种情况下建议FREETEXT超过CONTAINS

您可以在此搜索中使用变量,因此很容易适应存储过程。

declare @token varchar(256);
select @token = 'perform';

select * from Problem
where   freetext(Name, @token)
or      freetext(Solution, @token);
--this will match 'perform' and 'performing'