我对如何在现有的Lucene索引中添加facet感到有点难过。
我使用Lucene 3.1创建了一个Lucene索引(没有任何方面创建)。
我查看了Lucene文档的facet,并在那里向他们展示了如何从头开始创建带有facet的索引,即创建一个新的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);
上述代码是否索引与原始索引中存储的文档相同的文档,但添加了类别数据?例如,原始文档中非存储字段的数据是否仍然存在于新创建和索引的文档中?
还有更好的方法来进行此更新(可能不会创建新索引)...
答案 0 :(得分:1)
好的,这里有一些关于我如何解决这个问题的见解:
如果您只想使用Lucene(如问题中所述),您只能在以下情况下执行此操作:
所有这一切,我注意到,至少在方面部分,使用Solr更容易实现,并且,至少在我的情况下,性能不会降低,但实际上有时更好。 Solr的优势在于它可以“自动神奇地”创建方面(在与刻面相关的所有字段上)。没有额外的方面索引,没有方面“路径”的手动声明等。并且facet的Solr查询API也比Lucene更友好。
从Lucene迁移到Solr时可能遇到的问题是:
new SpanQuery("My blue boat*")
并且自动神奇地拥有在幕后创建的正确查询词。如果要将大量使用所述编程查询API的Lucene查询转换为Solr查询,则必须创建自己的工具来生成相应的Lucene查询字符串。您当然可以使用Lucene API构建查询对象,然后在将它们发送到Solr之前对它们执行toString()
,但这不会一直有效,并且对于某些复杂的,可能会变得非常复杂,查询。