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

标签 c# sql-server search full-text-search user-input

将用户输入的搜索词转换为可在 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 子句。

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

最佳答案

如何使用 .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);
    

关于c# - 将用户输入的搜索查询转换为用于 SQL Server 全文搜索的 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/506034/

相关文章:

c# - 列表框迭代 WPF

mysql - 在 SQL 中连接多个表

sql - 有没有办法改变设计而不从头开始创建表格?

python - Grep 多层可迭代的字符串匹配(Python)

Python - 搜索字典

c# - "Unable to translate Unicode character"保存到txt文件时出错

c# - 在 C# 中以编程方式将文本添加到剪贴板

c# - 使用 C# 获取 ec2-instance 标签

sql - 如何同时向数据库中的两个表插入数据?

MySQL 在字符串的开头/结尾处搜索和替换