首页 文章

Lucene:为现有索引添加方面

提问于
浏览
3

关于如何为已经存在的 Lucene 索引添加 facet,我有点难过。

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

我已经查看了 Lucene 文档的 facet,并在那里向他们展示了如何从头开始创建一个带有 facet 的索引,i.e。你创建一个新的 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);

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

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

1 回答

  • 1

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

    • 如果你想用 Lucene-only 做(如问题中所述),你只能在以下情况下这样做:

    • 您需要的所有字段也都存储在原始索引中。如果存在仅被索引(并且未存储)的字段,则无法恢复它们以便在新索引中使用 re-index 它们(具有构面)

    • 您还必须了解用于创建原始索引的分析器和用于创建查询的分析器:

    • 在创建新索引时,需要原始 index-time 分析器才能获得相同的术语(来自存储的值)

    • 在创建对原始索引的查询时,在各种 QueryParsers 上使用的分析器需要能够为新索引查询相同的查询

    所有这一切,我注意到,至少对于方面部分,使用 Solr 更容易实现,并且,至少在我的情况下,性能不会降低,但实际上有时更好。 Solr 的优势在于它可以“自动神奇地”创建方面(在与刻面相关的所有字段上)。没有额外的方面索引,没有方面“路径”的手动声明等。并且 facet 的 Solr 查询 API 也比 Lucene 更友好。

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

    • 您仍然需要 Lucene Analyzers 上用于索引和查询初始 Lucene 索引的所有信息。您传递给 Solr 的事实还增加了查看这些 Lucene 分析仪如何映射到 Solr 所提供的内容的开销(大多数 Solr Analyzers/Filters 与 Lucene 的相同,但不是全部)

    • Solr 没有 Lucene 编程查询 API(没有办法做new SpanQuery("My blue boat*")并且自动神奇地在幕后创建了正确的查询术语)。如果要将大量使用所述编程查询 API 的 Lucene 查询转换为 Solr 查询,则必须创建自己的工具来生成相应的 Lucene 查询字符串。您当然可以使用 Lucene API 构建查询对象,然后在将它们发送到 Solr 之前对它们执行toString(),但这不会一直有效,并且对于某些复杂的查询可能会变得非常复杂。

相关问题