将用户输入的搜索词转换为可在 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/全文本搜索+ +(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类为好,这做一些翻译的给你。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top