有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在将我的Lucene索引移动到离线状态,以便由JMS队列的使用者完成。我让一切都正常运转。它正确地创建了索引,并且我能够将索引文件重新同步到新框中。问题是让Lucene使用新索引的最佳方法是什么?其他人如何重新初始化他们的IndexWriter以使用新的索引文件? 谢谢


共 (1) 个答案

  1. # 1 楼答案

    对于我之后的其他人,以下是我所做的

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

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

    !/垃圾箱/垃圾箱

    时间=date +%s
    rsync-avtomcat@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目录中的目录列表
    • 它根据新目录的名称对它们进行排序,并获取最后一个(最新的)
    • 服务器会删除除最后两个索引之外的所有旧索引(以防其中一个索引损坏)
    • 我创建了一个指向新目录的新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");
            }
        }