在ASP.NET MVC站点中正确构建Lucene.Net用法

时间:2010-08-13 22:02:58

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

我正在构建一个ASP.NET MVC站点,我计划使用Lucene.Net。我已经设想了一种构建Lucene使用方法的方法,但不确定我的计划架构是否正常和有效。


我的计划:

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

我的问题:

  • 这是一个很好的结构 - 我该如何改进呢?
  • 我应该注意 任何性能/效率问题
  • 另外,不重复使用IndexReaders和IndexWriters 会产生巨大的代码味道吗?

2 个答案:

答案 0 :(得分:15)

所有三个问题的答案都是一样的:重复使用读者(可能还有作者)。您可以使用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
}

答案 1 :(得分:13)

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

OnApplication_Start完整索引对我来说有点不合适 - 应该可以在它自己的线程中运行,以免阻止其他昂贵的启动活动。