将用户输入的搜索查询转换为用于 SQL Server 全文搜索的 where 子句

Posted

技术标签:

【中文标题】将用户输入的搜索查询转换为用于 SQL Server 全文搜索的 where 子句【英文标题】:Converting user-entered search query to where clause for use in SQL Server full-text search 【发布时间】:2010-10-05 02:19:41 【问题描述】:

将用户输入的搜索词转换为可在 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"'))

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

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

【问题讨论】:

【参考方案1】:

我意识到这与您最初的问题有点偏离,但您是否考虑过放弃 SQL 全文索引并改用 Lucene/Solr 之类的东西?

【讨论】:

是的,我想在某个时候迁移到 Lucene,虽然我过去接触过它,虽然设置基础相对简单,但让它做同样的事情我现在要做的工作有点多,所以我把它搁置了。【参考方案2】:

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

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

【讨论】:

注:文章需要注册和订阅电子邮件通讯(所以如果你能忍受这样的事情不是问题) 这很好用。您可以在下面看到如何实现它。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

GoldParser 和 Calitha 的组合应该可以解决您的问题。

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

【讨论】:

【参考方案5】:

如何使用 .Net / C# / Entity Framework 实现公认的答案...

    使用 nuget 安装 Irony。

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

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

    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);
    

    也许写一个这样的存储过程:

    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
    

    运行查询。

    var fishes = db.SearchLivingFish(query);
    

【讨论】:

【参考方案6】:

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

禁用停用词,创建自己的停用词列表和/或设置要转换的干扰词,如SQL 2008: Turn off Stop Words for Full Text Search Query 中所述

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

select * from sys.fulltext_system_stopwords where language_id = 1033

【讨论】:

以上是关于将用户输入的搜索查询转换为用于 SQL Server 全文搜索的 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

搜索页面的 SQL 查询

用于将 SQL 查询转换为 MongoDB 查询的 PQL 包

使用 LIKE 将 Oracle 查询转换为 SQL Server 查询

将一个sql语句用于不同的搜索组合

我无法将 SQL 选择查询结果转换为位

将作为整数输入的参数转换为 JasperReports 中的字符串