2011-03-15 82 views
1

我正在將我的Lucene索引離線移動到由JMS隊列的通信者完成的過程中。我擁有一切應有的工作。它正確地創建索引,並且我能夠將索引文件rsync同步到新盒子。問題是讓Lucene使用新索引的最佳方法是什麼?其他人如何重新初始化其IndexWriters以使用新的索引文件? 謝謝!將Lucene索引移動到另一臺服務器

+0

我假設你有一個在新的框索引的所有文件,對不對? – remo 2011-03-16 12:52:04

+0

爲什麼你不能正常打開索引? (還有什麼其他選擇?) – Xodarap 2011-03-16 14:01:48

回答

1

對於追隨我的其他人,這是我所做的。

目標是讓我的JMS消費者生成我的lucene索引,然後讓我的每個服務器在完成後提取新索引。 下面是我所採取的步驟:

  • 創建一個crontab來產生我的新指數每晚
  • 創建一個crontab來調用腳本updateLuceneIndex.sh在每臺服務器上更新新的索引

!/ bin/sh

TIME = date +%s;
rsync -av tomcat @ consumer1。 * .COM:/家庭/ tomcat的/ Lucene的/家庭/ tomcat的/ Lucene的
回聲$ TIME
MV -f /家庭/ tomcat的/ Lucene的/ Lucene的/家庭/ tomcat的/ Lucene的/ $ TIME

由於以上你看到的它使用時間戳的目錄名稱,以便在新的指數將在名爲像

/home/tomcat/lucene/1300291879 
  • 文件夾中顯示的服務器代碼會搶在/ home目錄的列表/ tomcat的/ Lucene的目錄。
  • 它對其進行排序根據新目錄的名稱,並抓住最後一個(最新)
  • 比刪除所有舊索引除了最後2(萬一有損壞)
  • 我創建的服務器指向新目錄的新IndexReader

我不確定這是否是線程安全的。我想如果有人在我切換時嘗試搜索,他們會得到一個錯誤,但我目前沒有那麼多搜索來做出這種可能的情況。但是,隨着我們的流量增長,它肯定會成爲事情可能破裂的地方。如果有人知道更好的方法,請告知。

下面是代碼:

public void initialize(File newIndexDirectory) throws CorruptIndexException, IOException { 
     try { 
      File path = (newIndexDirectory == null) ? new File(indexDirectory) : newIndexDirectory; 
      Directory index = new SimpleFSDirectory(path); 
      searcher = new IndexSearcher(index); 
      logger.debug("Successfully initialized index at: " + path.getAbsolutePath()); 
      currentIndexFile = path; 
     } catch (Exception e) { 
      logger.warn("Lucene index is corrupt"); 
     } 
    } 
+0

使用你的方法一年後,它如何工作? – Hirsty 2013-04-12 09:14:10

相關問題