将Lucene索引移动到另一台服务器

时间:2011-03-15 20:09:18

标签: java lucene indexing

我正在将我的Lucene索引脱机移动,由一个JMS队列的conusmer完成。我完全按照它应有的方式工作。它正确创建索引,我能够将索引文件rsync到新框。问题是让Lucene使用新索引的最佳方法是什么?其他人如何重新初始化他们的IndexWriters以使用新的索引文件? 谢谢!

1 个答案:

答案 0 :(得分:1)

对于那些追随我的人来说,这就是我所做的。

目标是让我的JMS使用者生成我的lucene索引,然后让我的每个服务器在完成后拉出新索引。 以下是我采取的步骤:

  • 创建了一个crontab,以便每晚生成我的新索引
  • 创建一个crontab来调用脚本updateLuceneIndex.sh来更新每个服务器上的新索引

!/ bin / sh的

TIME = date +%s;
rsync -av tomcat @ consumer1。 * .com:/ home / tomcat / lucene / home / tomcat / lucene
echo $ TIME
mv -f / home / tomcat / lucene / lucene / home / 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");
        }
    }