是否可以合并Lucene.NET索引

时间:2015-12-18 16:45:26

标签: .net lucene lucene.net

我为归档文件创建了许多Lucene.NET索引 索引以相同的方式创建 索引不会更改,但每个索引都需要数天才能完成。 我想要单个应用程序来查询所有索引。

我想知道是否可以将这些索引合并为一个索引?

我知道另一种方法是创建一个依次查询每个索引的搜索应用程序 - 但这不是我的首选选项,因为它引入了大量的维护开销,原因我无法在此解释。

1 个答案:

答案 0 :(得分:1)

由@DarkFalcon评论的索引合并工具也适用于.Net,see here。看起来不合适。看起来像Java Lucene 4.5.0的自动端口,或者其他一些端口,并且不能使用当前版本的Lucene.Net。

但是,通过IndexWriter API合并索引实际上非常简单。您可以使用IndexWriter.AddIndexes方法。只需在目标索引上打开一个writer,打开要合并的每个索引的读者,将它们放入一个数组中,然后调用该方法。

就管理多个索引而言,您可以使用MultiReader更有效地搜索多个索引,而不是手动合并单独搜索的结果。

这是一个应该实际工作的IndexMergeTool版本:

using System;
using Lucene.Net.Index;
using Lucene.Net.Store;

public class IndexMergeTool
{
    public static void Main(string[] args)
    {
        if (args.Length < 3)
        {
            Console.Error.WriteLine("Usage: IndexMergeTool <mergedIndex> <index1> <index2> [index3] ...");
            Environment.Exit(1);
        }
        FSDirectory mergedIndex = FSDirectory.Open(args[0]);

        IndexWriter writer = new IndexWriter(mergedIndex, null, true, IndexWriter.MaxFieldLength.UNLIMITED);

        IndexReader[] indexes = new IndexReader[args.Length - 1];
        for (int i = 1; i < args.Length; i++)
        {
            indexes[i - 1] = IndexReader.Open(FSDirectory.Open(args[i]), true);
        }

        Console.WriteLine("Merging...");
        writer.AddIndexes(indexes);

        Console.WriteLine("Closing Readers...");
        foreach (IndexReader index in indexes)
        {
            index.Dispose();
        }
        writer.Dispose();
        Console.WriteLine("Done.");
    }
}