Lucene:为现有索引添加方面

时间:2013-05-22 11:29:39

标签: lucene updates facet

我对如何在现有的Lucene索引中添加facet感到有点难过。

我使用Lucene 3.1创建了一个Lucene索引(没有任何方面创建)。

我查看了Lucene文档的facet,并在那里向他们展示了如何从头开始创建带有facet的索引,即创建一个新的Lucene Document对象,使用分类工具添加构面信息到它(类别),然后在Lucene索引中编写该文档(使用IndexWriter),这也将额外数据添加到分类索引(通过TaxonomyWriter),如下所述:

http://lucene.apache.org/core/3_6_2/api/all/org/apache/lucene/facet/doc-files/userguide.html#facet_accumulation

然而,我想要的是使用已经存储在现有Lucene索引中的数据,并从中创建一个新的Lucene索引(带有分类索引),它将包含与原始索引完全相同的数据,以及各种类别信息。

我的问题更准确:

是否足以从原始索引读取文档,创建其CategoryPath,然后将其写入新索引,如下所示:

//get a document from original Lucene index:
Query query = queryParser.parse("*:*");
originalTopDocs = originalIndexSearcher.search(query,100);
Document originalDocument = originalIndexSearcher.doc(originalTopDocs.scoreDocs[1].doc)

//create categories for original document
CategoryDocumentBuilder categoryDocBuilder = new CategoryDocumentBuilder(taxonomyWriter);
categoryDocBuilder.setCategoryPaths(categoriesPaths);

//create new document from original document + categories:
Document originalDocumentWithCategories = categoryDocBuilder.build(originalDocument);

//write new document to new index:
newIndexWriter.write(originalDocumentWithCategories);

上述代码是否索引与原始索引中存储的文档相同的文档,但添加了类别数据?例如,原始文档中非存储字段的数据是否仍然存在于新创建和索引的文档中?

还有更好的方法来进行此更新(可能不会创建新索引)...

1 个答案:

答案 0 :(得分:1)

好的,这里有一些关于我如何解决这个问题的见解:

  1. 如果您只想使用Lucene(如问题中所述),您只能在以下情况下执行此操作:

    • 您需要的所有字段也已存储在原始索引中。如果有一些字段仅被索引(并且未存储),则无法恢复它们以便在新索引中重新索引它们(使用构面)
    • 您还必须了解用于创建原始索引的分析器和用于创建查询的分析器:
      • 需要原始索引时间分析器才能在创建新索引时获取相同的术语(来自存储的值)
      • 在创建对原始索引的查询时,在各种QueryParsers上使用的分析器需要能够为新索引重新构建相同的查询
  2. 所有这一切,我注意到,至少在方面部分,使用Solr更容易实现,并且,至少在我的情况下,性能不会降低,但实际上有时更好。 Solr的优势在于它可以“自动神奇地”创建方面(在与刻面相关的所有字段上)。没有额外的方面索引,没有方面“路径”的手动声明等。并且facet的Solr查询API也比Lucene更友好。

    从Lucene迁移到Solr时可能遇到的问题是:

    • 您仍然需要Lucene Analyzers上用于索引和查询初始Lucene索引的所有信息。您传递给Solr的事实也增加了查看这些Lucene分析仪如何映射Solr所提供的开销(大多数Solr分析仪/过滤器与Lucene相同,但不是全部)
    • Solr没有Lucene程序化查询API(没有办法new SpanQuery("My blue boat*")并且自动神奇地拥有在幕后创建的正确查询词。如果要将大量使用所述编程查询API的Lucene查询转换为Solr查询,则必须创建自己的工具来生成相应的Lucene查询字符串。您当然可以使用Lucene API构建查询对象,然后在将它们发送到Solr之前对它们执行toString(),但这不会一直有效,并且对于某些复杂的,可能会变得非常复杂,查询。