【问题标题】:Combining Lucene.NET and SQL Server to retrieve entities结合 Lucene.NET 和 SQL Server 检索实体
【发布时间】:2017-12-07 17:09:43
【问题描述】:

我想在我的网站上实现一个全文搜索引擎,我将使用 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 是一个枚举(整数),它引用一个实体类(例如 Posts、Comments、Entries 等),而 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 的列,效率会更高吗?

谢谢:)

【问题讨论】:

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


    【解决方案1】:

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

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

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

    是的,这是一个很常见的模式,真的。如果您需要显示一个搜索结果列表供用户选择,在显示整个选定实体(即像 google 搜索结果页面)之前,您可能希望在 lucene 中存储足够的数据来显示搜索结果列表,并且仅当用户选择其中之一时才查询数据库。

    如果在 LuceneSearchResultin 中只创建一个结合 ModelType 和 GenericId 的列,会不会更高效?

    不,我看不出你应该这样做的任何特殊原因。大概这些字段将被存储而不是被索引(也就是说,您不会对这些字段进行查询),所以我认为这不会产生任何重大影响。

    【讨论】:

    • 感谢您的回答@femtoRgon!现在,我想知道 - 如果我想选择仅在特定实体中搜索(例如,仅在帖子中或仅在评论中),我是否还应该索引 ModelType 列,它是类型的标识符实体?
    • @spiros - 是的,如果你想搜索它,它需要被索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多