如何通过存储过程处理"keyword search"?



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

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

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

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

建议创建一个新的全文目录,并将表和列分配给该目录。确保您的目录以适当的频率更新,以满足您的需求。

然后可以使用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' 

最新更新