Java Lucene:如何在几个独立的索引集上执行搜索并合并结果?

Java Lucene:如何在几个独立的索引集上执行搜索并合并结果?,java,search,lucene,search-engine,Java,Search,Lucene,Search Engine,现在我有几个Lucene索引集(我称之为碎片),它们对不同的文档集进行索引。它们是独立的,这意味着我可以在不阅读其他内容的情况下对它们中的每一个执行搜索。然后我得到一个查询请求。我想在每个索引集中搜索它,并结合结果形成最终的顶级文档 我知道在给文档打分时,Lucene需要知道每个术语的名称,不同的索引集会给同一术语赋予不同的名称(因为不同的索引集包含不同的文档集)。因此,据我所知,我无法直接比较来自不同索引集的文档分数。那么我应该如何生成最终结果呢 一个显而易见的解决方案是首先合并索引,然后对大

现在我有几个Lucene索引集(我称之为碎片),它们对不同的文档集进行索引。它们是独立的,这意味着我可以在不阅读其他内容的情况下对它们中的每一个执行搜索。然后我得到一个查询请求。我想在每个索引集中搜索它,并结合结果形成最终的顶级文档

我知道在给文档打分时,Lucene需要知道每个术语的名称,不同的索引集会给同一术语赋予不同的名称(因为不同的索引集包含不同的文档集)。因此,据我所知,我无法直接比较来自不同索引集的文档分数。那么我应该如何生成最终结果呢

一个显而易见的解决方案是首先合并索引,然后对大索引执行搜索。然而,这对我来说太费时了,因此是不可接受的。有没有其他更好的解决方案

注:除了Lucene和Hadoop之外,我不想使用任何软件包或软件(如Katta)。

我想这就是你想要的。如果您有多个IndexReader,请说
reader1
reader2

MultiReader multiReader = new MultiReader(reader1, reader2);
IndexSearcher searcher = new IndexSearcher(multiReader);
我想这就是你要找的。如果您有多个IndexReader,请说
reader1
reader2

MultiReader multiReader = new MultiReader(reader1, reader2);
IndexSearcher searcher = new IndexSearcher(multiReader);

我想在Hadoop映射器和还原器中实现这一点。那么,在映射器中打开一个超过GB级索引的IndexReader,并将该读卡器直接传递给reducer,然后在reducer中的读卡器上构建搜索的成本是多少呢?你能提供一些线索吗?一般来说,打开一个新的读卡器是很昂贵的,你应该保留同一个读卡器以供重用,只有在必要时才重新打开。我是否可以使用IndexReader作为Map OutputFormat(换句话说,我编写了一个Hadoop可写的IndexReader)并在下面的Reduce作业中重用它?这是个好主意吗?换句话说,我的意思是我打开一个IndexReader在mapper中做一些工作,然后我序列化它而不是关闭它。在下面的映射程序中,我反序列化IndexReader并重用它。这是否有效?我对Hadoop风格的序列化不太了解,但除非它发挥了某种魔力,否则我怀疑这会比打开IndexReader产生更大的成本,如果它真的有效的话。对我来说,索引阅读器的序列化似乎没有多大意义。我想在Hadoop映射器和还原器中实现这一点。那么,在映射器中打开一个超过GB级索引的IndexReader,并将该读卡器直接传递给reducer,然后在reducer中的读卡器上构建搜索的成本是多少呢?你能提供一些线索吗?一般来说,打开一个新的读卡器是很昂贵的,你应该保留同一个读卡器以供重用,只有在必要时才重新打开。我是否可以使用IndexReader作为Map OutputFormat(换句话说,我编写了一个Hadoop可写的IndexReader)并在下面的Reduce作业中重用它?这是个好主意吗?换句话说,我的意思是我打开一个IndexReader在mapper中做一些工作,然后我序列化它而不是关闭它。在下面的映射程序中,我反序列化IndexReader并重用它。这是否有效?我对Hadoop风格的序列化不太了解,但除非它发挥了某种魔力,否则我怀疑这会比打开IndexReader产生更大的成本,如果它真的有效的话。对我来说,索引阅读器的序列化似乎没有多大意义。