结合Lucene.NET和SQL Server来检索实体

时间:2017-12-07 17:09:44

标签: c# sql-server entity-framework lucene

我想在我的网站上实现一个全文搜索引擎,我将使用Lucene.NET。我的主要数据使用EF6存储在SQL Server中。

我遇到的问题是我想搜索多个实体(例如帖子,评论,消息,条目等)。一些实体具有属性Title,一些其他模型具有属性Content,而另一些具有Description或所有这些的组合。

所以,我正在考虑只实现一个自定义lucene搜索表,如下所示:

public class LuceneSearchResult
{
    public ModelType ModelType { get; set; }
    public int GenericId { get; set; }

    public string Title { get; set; }
    public string Content { get; set; }
    public string Description { get; set; }
}

现在,ModelType是一个引用实体类的枚举(整数)(例如帖子,注释,条目等),GenericId是指定ModelType的Id(整数主键)。例如,唯一的主键(即使Lucene不识别一个)将是ModelType = Post,GenericId = 3.

我使用这种方法,所以当我搜索字符串时,我将使用MultiFieldQueryParser来查看LuceneSearchResult的Title,Content,Description列。从结果中,我将获得ModelType和GenericId,然后我将使用它来使用EF6从SQL Server中检索正确的对象。

我正在采用这种方法,所以我不会创建很多Lucene表,每个表都有一个,这些表很多。

问题:

  • 这是解决此问题的正确方法吗?

  • 在Lucene中搜索以获取包含该字符串的对象,然后从SQL Server检索整个实体是否有效?

  • 如果在LuceneSearchResultin中我只创建一个结合了ModelType和GenericId的列,那会更有效吗?

谢谢:)

1 个答案:

答案 0 :(得分:1)

  

这是解决这个问题的正确方法吗?

假设它支持您的所有搜索要求,是的。

  

在Lucene中搜索以获取包含该字符串的对象,然后从Sql Server检索整个实体是否有效?

是的,这是一个非常常见的模式,真的。如果您需要在显示整个所选实体(例如Google搜索结果页面)之前显示供用户选择的搜索结果列表,您可能希望在lucene中存储足够的数据来显示搜索结果列表,以及只有在用户选择其中一个数据库时才查询数据库。

  

如果在LuceneSearchResultin中,我只创建一个组合ModelType和GenericId的列,那会更有效吗?

不,我没有看到你应该这样做的任何特殊原因。大概这些字段将被存储而不是索引(也就是说,你不会在这些字段上查询),所以我不相信这会产生任何重大影响。