我为归档文件创建了许多Lucene.NET索引 索引以相同的方式创建 索引不会更改,但每个索引都需要数天才能完成。 我想要单个应用程序来查询所有索引。
我想知道是否可以将这些索引合并为一个索引?
我知道另一种方法是创建一个依次查询每个索引的搜索应用程序 - 但这不是我的首选选项,因为它引入了大量的维护开销,原因我无法在此解释。
答案 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.");
}
}