【问题标题】:Moving Lucene index to another server将 Lucene 索引移动到另一台服务器
【发布时间】:2011-03-15 20:09:17
【问题描述】:

我正在将我的 Lucene 索引离线移动到由 JMS 队列的用户完成。我让这一切正常工作。它正确创建索引,我可以将索引文件同步到新框。问题是让 Lucene 使用新索引的最佳方法是什么?其他人如何重新初始化他们的 IndexWriters 以使用新的索引文件? 谢谢!

【问题讨论】:

  • 我假设你有所有在新框中索引的文件,对吧?
  • 为什么不能正常打开索引? (还有哪些其他选择?)

标签: java lucene indexing


【解决方案1】:

对于追随我的其他人,这就是我所做的。

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

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

!/bin/sh

时间=date +%s;
rsync -av tomcat@consumer1.*.com:/home/tomcat/lucene /home/tomcat/lucene
回声 $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");
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多