【问题标题】:Lucene: add facets to existing indexLucene:向现有索引添加方面
【发布时间】:2013-05-22 11:29:38
【问题描述】:

我对如何将构面添加到已经存在的 Lucene 索引有点困惑。

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

我查看了 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 updates facet


    【解决方案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 构建查询对象,然后在将它们发送到 Solr 之前对它们执行 toString(),但这并不总是有效,并且对于某些复杂的查询可能会变得非常复杂。

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多