2011-11-22 54 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可能是過度殺傷的。