我为存档文件创建了许多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.");
}
}