【问题标题】:Proper structuring of Lucene.Net usage in an ASP.NET MVC site在 ASP.NET MVC 站点中正确构建 Lucene.Net 使用
【发布时间】:2010-08-13 22:02:58
【问题描述】:

我正在构建一个 ASP.NET MVC 站点,我计划在其中使用 Lucene.Net。我设想了一种方法来构建 Lucene 的使用,但不确定我计划的架构是否可行且高效。


我的计划:

  • 在 Global.asax 中的 Application_Start 事件中:我检查文件系统上是否存在索引 - 如果不存在,我创建它并用从数据库中提取的文档填充它。
  • 提交新内容时:创建IndexWriter,填写文档,写入索引,最后处理IndexWriterIndexWriters 没有被重用,因为我无法想象在 ASP.NET MVC 应用程序中这样做的好方法。
  • 编辑内容时:我重复提交新内容时的相同过程,只是我先删除旧内容,然后添加编辑内容。
  • 当用户搜索内容时:我检查HttpRuntime.Cache 以查看用户在过去 5 分钟内是否已经搜索过该词 - 如果有,我会返回这些结果;否则,我创建一个IndexReader,构建并运行一个查询,将结果放入HttpRuntime.Cache,将它们返回给用户,最后处置IndexReader。再一次,IndexReaders 没有被重复使用。

我的问题:

  • 这是一个好的结构 - 我该如何改进它?
  • 是否有任何性能/效率问题我应该注意?
  • 另外,不重用 IndexReaders 和 IndexWriters 是否有很大的代码异味?

【问题讨论】:

  • 如果你写了一个关于如何将 Lucene.NET 与你的 ASP.NET MVC 站点集成的简短的分步教程,那将是很棒的,最好是作为一个关于 SO 的 wiki 风格的答案。跨度>
  • @FreshCode 好电话。我的实现并不完美,但它确实有效,我想我会在下周期末考试结束时写出来。无论如何,我一直打算发布一堆 ASP.NET MVC 助手,所以我会及时通知你。
  • @MaximZaslavsky 你写过那个教程吗?我有兴趣阅读它。

标签: c# asp.net asp.net-mvc lucene lucene.net


【解决方案1】:

所有三个问题的答案都是相同的:重用您的读者(也可能是您的作者)。您可以使用 singleton 模式来执行此操作(即将您的阅读器/编写器声明为公共静态)。 Lucene 的FAQ 告诉你同样的事情:分享你的读者,因为第一个查询真的很慢。 Lucene 会为您处理所有锁定,因此您没有理由不拥有共享阅读器。

让您的作者留在身边并(使用NRT 模型)从中获取读者可能是最简单的。如果您很少写入索引,或者您对速度的需求不大,那么每次都打开您的编写器可能是可以的。我就是这么做的。

编辑:添加代码示例:

public static IndexWriter writer = new IndexWriter(myDir);

public JsonResult SearchForStuff(string query)
{
    IndexReader reader = writer.GetReader();
    IndexSearcher search = new IndexSearcher(reader);
    // do the search
}

【讨论】:

  • 感谢您的回答。这意味着我应该将 IndexReader 作为控制器 public static 字段?另外,如何更新 IndexReader(更新索引时)? :) 或者你是说留住作者而不是留住读者更好?
  • 是的,将其设为公共静态字段。除非您将有多个进程写入同一位置,否则我认为最好保留编写器并使用 NRT 模型来获取您的读者。如果你决定保留读者,reader.IsCurrent() 会告诉你读者是否是当前的,reader.Reopen() 会重新打开它。我为 NRT 样式添加了一个代码示例。
  • 不是事后关闭IndexWriter还是频繁commit就够了?
  • @jorgebg:您应该只需要在应用关闭时关闭编写器(一般情况下)
  • @Xodarap - 这篇文章非常有用,谢谢!在我们的 MVC 应用程序中,我们没有直接写入索引,因为我们不想阻塞,所以我们使用消息队列来处理写入。你认为这是一个好的策略吗?我们将 Reader 设为静态并在它不是最新的时重新打开它。
【解决方案2】:

我可能会跳过缓存——Lucene 非常非常有效。也许效率如此之高,以至于再次搜索比缓存更快。

OnApplication_Start 完整索引对我来说感觉有点不对劲——可能应该在它自己的线程中运行,以免阻塞其他昂贵的启动活动。

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2011-03-29
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多