LinqToSql和全文搜索-能做到吗?

时间:2020-03-05 18:54:44  来源:igfitidea点击:

有没有人想出一种使用标准LinqToSql查询语法对任意数量的任意关键字执行全文本搜索(" FREETEXT()CONTAINS()`)"的好方法?

我显然希望避免使用存储的Proc或者生成动态SQL调用。

显然,我可以将搜索字符串中的参数输入到使用FREETEXT()或者CONTAINS()的SPROC上,但是我希望通过搜索并建立如下查询来更具创意:

"意大利辣味香肠比萨饼"和汉堡,而不是"苹果派"。

疯狂,我知道,但是能够直接从LinqToSql做到这一点不是很好吗?如何实现这一目标的任何技巧将不胜感激。

更新:我想我可能会在这里做些...

另外:我回滚了对我的问题标题所做的更改,因为它实际上改变了我所询问内容的含义。我知道LinqToSql不支持全文搜索,如果我想知道的话,我会问这个问题。取而代之的是,我更新了自己的头衔来安抚那些动动手指的群众。

解决方案

回答

不幸的是,LINQ to SQL不支持全文搜索。

我认为有很多产品可以想到:Lucene.NET,NHibernate Search浮现在脑海。用于NHibernate的LINQ与NHibernate Search相结合可能会提供该功能,但两者仍处于beta阶段。

回答

我已经设法通过使用表值函数封装全文搜索组件来解决此问题,然后在LINQ表达式中对其进行引用,从而保持了延迟执行的好处:

string q = query.Query;
IQueryable<Story> stories = ActiveStories
                        .Join(tvf_SearchStories(q), o => o.StoryId, i => i.StoryId, (o,i) => o)
                        .Where (s => (query.CategoryIds.Contains(s.CategoryId)) &&
                                    /* time frame filter */
                                (s.PostedOn >= (query.Start ?? SqlDateTime.MinValue.Value)) &&
                                (s.PostedOn <= (query.End ?? SqlDateTime.MaxValue.Value)));

这里的" tvf_SearchStories"是内部使用全文本搜索的表值函数