如何合并来自两个不同(非分片)Lucene索引的匹配

时间:2009-08-16 21:25:25

标签: lucene

我有两个单独的索引,它们包含不同的字段,这些字段一起包含索引的所有可搜索字段。例如,第一个索引保存所有文档的索引文本,第二个索引保存每个文档的标记。

注意下面的例子有点不对劲,因为我已经更改了实体的名称。 索引1:    文本    文档ID

索引2:    tag-name:“非常重要”    用户:“Fred的id”

我希望将索引分开,因为每当用户添加/删除标记时,不断更新单个索引似乎很浪费。

到目前为止,我认为我可能需要处理两个搜索结果并手动合并(在代码中)。还有其他建议吗?

我不想合并单独/分片索引。

3 个答案:

答案 0 :(得分:4)

Lucene有一种IndexReader来支持这种安排 - ParallelReader

使用起来可能有点棘手,因为两个索引中记录的Lucene文档标识符必须相同。实际上,这意味着以相同的顺序向两个索引添加文档。我已经读过,在某些情况下,文档删除和索引优化可能会导致Lucene重新分配这些文档标识符,但我还没有尝试找出这是否属实。如果修改现有记录,可能需要格外小心。如果只附加新记录,应该没有问题。

这种方法通常称为“垂直分区”,而不是“水平分区”或分片。

答案 1 :(得分:0)

好像你需要在代码中合并索引。如果我理解正确,在搜索术语时,可以匹配文档文本或标记,并且每个标记都使用其相关文档ID进行索引。然后,您将有两个命中列表进行合并。由于标签和全文是非常不同的实体,因此您需要进行一些加权(可能在检索期间作为场增强)以达到良好的排名。因此,您可以使用以下公式合并文档k的标记匹配和全文命中:

score(k) = a*tagscore(k)+b*fulltextscore(k)

其中a和b将是凭经验确定的系数。

有关更详细的讨论,请参阅Grant Ingersoll的findabilitydebugging relevance issues in search篇论文。

答案 2 :(得分:0)

这种方法的主要问题与文档排名有关,因为默认算法(可能是大多数自定义算法,除了少数例外)都是基于术语频率和反向文档频率。

换句话说,记分员需要知道术语在文档中出现的次数,以及包含该术语的其他文档的数量。此信息存储在索引中的每个术语中,但不存储在多个索引中的聚合。

此问题的常见解决方案是两阶段方法。首先,针对每个索引运行查询以确定每个术语包含多少文档。接下来,聚合结果并再次运行查询,但这次反向文档频率随之发送。

可以想象,这不会像针对单个索引运行查询一样好,但由于没有任何内容是免费的,我认为这是将文档存储在多个索引之间的权衡。