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

Mun*_*Mun 12 c# sql-server search full-text-search user-input

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

+"e-mail" +attachment -"word document" -"e-learning"
Run Code Online (Sandbox Code Playgroud)

应该翻译成:

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

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

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

fra*_*nzo 8

如何使用.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);
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  5. 运行查询.

    var fishes = db.SearchLivingFish(query);
    
    Run Code Online (Sandbox Code Playgroud)


Bra*_*ndo 5

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

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

  • 注意:文章要求注册和订阅电子邮件简报(如果你能忍受这样的事情,那就没问题了) (2认同)