Lucene:将facet添加到现有索引

Lucene:将facet添加到现有索引,lucene,updates,facet,Lucene,Updates,Facet,对于如何将方面添加到已经存在的Lucene索引中,我感到有点困惑 我有一个使用Lucene 3.1创建的Lucene索引(创建时没有任何方面) 我已经查看了Lucene文档中的facet,在那里他们向您展示了如何从头创建一个带有facet的索引,也就是说,您创建一个新的Lucene文档对象,使用分类工具向其添加facet信息(类别),然后在Lucene索引中编写该文档(使用IndexWriter)这还将向分类法索引添加额外数据(通过TaxonomyWriter),如下所述: 然而,我想要的是使

对于如何将方面添加到已经存在的Lucene索引中,我感到有点困惑

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

我已经查看了Lucene文档中的facet,在那里他们向您展示了如何从头创建一个带有facet的索引,也就是说,您创建一个新的Lucene
文档
对象,使用分类工具向其添加facet信息(类别),然后在Lucene索引中编写该文档(使用
IndexWriter
)这还将向分类法索引添加额外数据(通过
TaxonomyWriter
),如下所述:

然而,我想要的是使用已经存储在现有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);
上述代码索引的文档是否与原始索引中存储的文档相同,但添加了类别数据?例如,原始文档中非存储字段的数据是否仍存在于新创建和索引的文档中


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

好的,下面是我如何解决此问题的一些见解:

  • 如果您只想使用Lucene(如问题中所述),您只能在以下情况下使用:

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

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

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