关于如何为已经存在的 Lucene 索引添加 facet,我有点难过。
我有一个使用 Lucene 3.1 创建的 Lucene 索引(没有任何方面创建)。
我已经查看了 Lucene 文档的 facet,并在那里向他们展示了如何从头开始创建一个带有 facet 的索引,i.e。你创建一个新的 Lucene Document
对象,使用分类工具向它添加构面信息(类别),然后在 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);
上面的代码是否索引与原始索引中存储的文档相同的文档,但添加了类别数据?例如,原始文档中 non-stored 字段的数据是否仍然存在于新创建的索引文档中?
还有更好的方法来进行此更新(可能不会创建新索引)...
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()
,但这不会一直有效,并且对于某些复杂的查询可能会变得非常复杂。