将用户输入的搜索词转换为可在 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 实现已接受的答案...
使用 nuget 安装 Irony。
编写这样的代码将用户输入的字符串转换为查询。
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);
关于c# - 将用户输入的搜索查询转换为用于 SQL Server 全文搜索的 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/506034/