是否可以合并Lucene.NET索引

我为存档文件创建了许多Lucene.NET索引.

索引以相同的方式创建.

索引不会更改,但每个索引都需要数天才能完成.

我想要单个应用程序来查询所有索引.

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

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

最佳答案 由@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.");
    }
}
点赞