3

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

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

我查看了有关方面的 Lucene 文档,它们向您展示了如何从头开始创建具有方面的索引,即您创建一个新的 LuceneDocument对象,使用分类工具向其添加方面信息(类别),然后编写该文档在 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);

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

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

4

1 回答 1

1

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

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

    • 您需要的所有字段也已存储在原始索引中。如果存在仅被索引(而不是存储)的字段,则您无法恢复它们以便在新索引中重新索引它们(带有构面)
    • 您还必须了解用于创建原始索引和用于创建查询的分析器:
      • 在创建新索引时,需要原始索引时间分析器才能(从存储的值)获得相同的术语
      • 需要在对原始索引创建查询时在各种 QueryParsers 上使用的分析器能够为新索引重新构造相同的查询

说了这么多,我注意到,至少在构面部分,使用 Solr 更容易实现,而且,至少在我的情况下,性能不会降低,但实际上有时会更好。Solr 的优势在于它“神奇地自动”创建构面(在与构面相关的所有字段上)。没有额外的构面索引,没有手动声明构面“路径”等。而且构面的 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 构建查询对象,然后toString()在将它们发送到 Solr 之前对其进行处理,但这并不总是有效,并且对于某些复杂的查询可能会变得非常复杂。
于 2013-08-05T11:53:08.627 回答