将用户输入的搜索查询转换为where子句,以便在SQL Server全文搜索中使用

将用户输入的搜索词转换为可用于where子句进行全文搜索以查询表并获取相关结果的查询的最佳方法是什么? 例如,用户输入以下查询:

+"e-mail" +attachment -"word document" -"e-learning" 

应该翻译成:

 SELECT * FROM MyTable WHERE (CONTAINS(*, '"e-mail"')) AND (CONTAINS(*, '"attachment"')) AND (NOT CONTAINS(*, '"word document"')) AND (NOT CONTAINS(*, '"e-learning"')) 

我目前正在使用查询解析器类 ,它使用正则表达式将用户输入的查询解析为标记,然后从标记构造where子句。

但是,鉴于这可能是许多使用全文搜索的系统的常见要求,我很好奇其他开发人员如何处理这个问题,以及是否有更好的做事方式。

这可能不是您正在寻找的,但它可能会为您提供一些进一步的想法。

http://www.sqlservercentral.com/articles/Full-Text+Search+(2008)/64248/

如何使用.Net / C#/ Entity Framework实现接受的答案…

  1. 使用nuget安装Irony。

  2. 从以下位置添加示例类: http : //irony.codeplex.com/SourceControl/latest#Irony.Samples/FullTextSearchQueryConverter/SearchGrammar.cs

  3. 编写这样的代码将用户输入的字符串转换为查询。

     var grammar = new Irony.Samples.FullTextSearch.SearchGrammar(); var parser = new Irony.Parsing.Parser(grammar); var parseTree = parser.Parse(userEnteredSearchString); string query = Irony.Samples.FullTextSearch.SearchGrammar.ConvertQuery(parseTree.Root); 
  4. 也许写这样的存储过程:

     create procedure [dbo].[SearchLivingFish] @Query nvarchar(2000) as select * from Fish inner join containstable(Fish, *, @Query, 100) as ft on ft.[Key] = FishId where IsLiving = 1 order by rank desc 
  5. 运行查询。

     var fishes = db.SearchLivingFish(query); 

除了@franzo上面的回答,您可能还想更改SQL中的默认停用词行为。 否则,包含单个数字(或其他停用词)的查询将不会返回任何结果。

如SQL 2008中所述,禁用停用词,创建自己的停用词列表和/或设置要转换的干扰词:关闭全文搜索查询的停用词

要查看(英文)sql停用词的系统列表,请运行:

 select * from sys.fulltext_system_stopwords where language_id = 1033 

我意识到这与你原来的问题有点相反,但你是否考虑过远离SQL全文索引并使用像Lucene / Solr这样的东西?

最简单的方法是使用动态SQL(我知道,在此处插入安全问题)并将短语分解为格式正确的字符串。

您可以使用函数将短语分解为可用于创建新字符串的表变量。

GoldParser和Calitha的组合应该把你排除在外。

这篇文章: http ://www.15seconds.com/issue/070719.htm也有一个googleToSql类,它为你做了一些翻译。