我对如何在已经存在的Lucene索引中添加facet有点困惑。
我有一个Lucene索引(创建没有任何方面)创建使用Lucene 3.1。
我已经看过Lucene文档的面,他们告诉你如何从零开始创建一个索引与面,即你创建一个新的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);
上面的代码是否索引了存储在原始索引中的相同文档,但是添加了类别数据?例如,原始文档中未存储字段的数据是否仍然存在于新创建和索引的文档中?
也有更好的方法来做这个更新(也许不创建一个新的索引)…
好吧,下面是我如何解决这个问题的一些见解:
-
如果您想只使用lucene(如问题中所述),您只能在以下情况下这样做:
- 您需要的所有字段也都存储在原始索引中。如果有字段只被索引(而不是存储),那么您无法恢复它们以便在新索引(带有facet)中重新索引它们
- 您还必须了解用于创建原始索引和用于创建查询的分析器:
- 在创建新索引
时,需要原始索引时间分析器来获得相同的项(从存储的值中) - 当在原始索引上创建查询时,需要在各种queryparser上使用的analyzer能够为新索引 重新构建相同的查询
说了这么多,我已经注意到,至少对于facet部分,使用Solr更容易实现,并且,至少对于我的情况,性能不会降低,但实际上有时更好。Solr的优势在于它可以"神奇地"自动创建facet(在所有与facet相关的字段上)。没有额外的面索引,没有手动声明的面"路径"等。Solr的facet查询API也比Lucene的API更友好。
从Lucene迁移到Solr时可能遇到的问题:
- 你仍然需要Lucene analyzer的所有信息来索引和查询初始Lucene索引。你传递给Solr的事实也增加了看到那些Lucene分析器如何映射到Solr必须提供的东西的开销(大多数Solr分析器/过滤器与Lucene的相同,但不是全部)
- Solr没有Lucene编程查询API(没有办法做
new SpanQuery("My blue boat*")
和自动神奇地在幕后创建正确的查询术语)。如果你想将大量使用编程查询API的Lucene查询转换为Solr查询,你必须制作自己的工具来生成相应的Lucene查询字符串。当然,你仍然可以使用Lucene API构建查询对象,然后在将它们发送到Solr之前对它们进行toString()
,但这并不是一直有效,并且对于某些复杂的查询可能会变得非常复杂。