2011-11-22 53 views
0

我可能正在构建一个Java servlet应用程序,它需要集成一个非常简单的Lucene索引。该索引只能在单个字段上搜索,然后我想将结果发回,可能是XML,也许是JSON,但在这一点上并不重要。主要的是索引本身不是问题。Lucene和servlet集成

我的问题是如何将这两者结合起来。我的倾向是从servlet应用程序的体裁上访问索引,因此我会运行它并将其存储在ServletContextListener中。然后,我可以构建一个相当简单的控制台来打开和关闭搜索服务。我还可以有一个应用程序来处理请求,并定期重建索引,然后交换新的索引以取代旧索引。出现的一个潜在问题是,如果/当索引被换出时,如何让servlet行为并等待一点。它应该不到一秒钟,我可以在凌晨2点这样做,但我仍然希望它尽可能地防弹。如果一个servlet向一个服务发出请求并且需要等待,那么涉及到什么样的超时?我在哪里/如何控制这个?

其他可能性是将索引作为独立的Java应用程序运行,或者在单独的servlet应用程序中运行索引,并让第一个应用程序通过servlet对其进行http调用。在最后一种方法中,我没有看到很多好处,它只是增加了更多的代码,而这些代码并没有真正起到任何作用。搜索请求无法直接从HTTP访问。

你的想法是什么?我很欣赏沿着这条线路经历过的任何人的意见。

+0

你为什么要定期重建索引?为什么不按照需要添加文档? –

+0

我需要每周清洁数据集。如果记录不在新的供稿中,则不应该在索引中。只是一个业务需求。 – dnuttle

+0

所以,你基本上正在努力解决切换应用程序以在不同的索引(切换文件名)中进行查找的时间,一周一次? –

回答

1

有一点要记住的是,建议是有一个单一的IndexWriter。我们走的是保持servlet内部的路线,我们面临的一个问题是,对于NLB对来说,您有两个servlet,每个servlet都想写。这要求你要么付出沉重的表现惩罚,要么以某种方式指定其中一个作为作者。

如果你有两台以上的服务器,这个问题当然会变得更加严重。但是如果你谈论的是在单个进程中运行的所有内容,那么这也许不值得担心。

我鼓励你重新考虑Solr。它在某种意义上具有更大的功能集,所以我可以理解为什么你会觉得它是“过度杀伤”的,但是它的设置和使用通常更快 - 这意味着纯粹的Lucene可能是过度杀伤的。