当前位置: 首页 > 知识库问答 >
问题:

Lucene:将facet添加到现有索引

慕兴平
2023-03-14

对于如何向已经存在的Lucene索引添加方面,我有点困惑。

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

我已经查看了Lucene文档中的facet,在那里他们向您展示了如何从头创建一个带有facet的索引,也就是说,您创建一个新的Lucene文档对象,使用分类工具向其添加facet信息(类别),然后在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);

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

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

共有1个答案

龙正初
2023-03-14

好吧,下面是我如何解决这个问题的一些见解:

>

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

    • 您需要的所有字段也已存储在原始索引中。如果有一些字段只编制了索引(但未存储),则您无法恢复这些字段,以便在新索引中对其重新编制索引(带方面)
    • 您还必须了解用于创建原始索引和用于创建查询的分析器:
      • 创建新索引时,需要原始索引时间分析器,以便(从存储的值)获得相同的术语
      • 在原始索引上创建查询时,各种QueryParser上使用的分析器需要能够为新索引重新构造相同的查询

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

      从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(),但这并不是一直都有效,而且对于某些复杂的查询,这可能会变得非常复杂

  •  类似资料:
    • 我有一个现有的Solr设置,运行在一个独立的Solr实例上。我被要求为此设置添加弹性和高可用性。因此,我想将复制添加到我的设置中,我认为SolrCloud是一种方式? 我已经在SolrCloud wiki上浏览了演示。然而,我不确定如何将现有的Solr实例添加到ZooKeeper,然后再添加一些节点以供复制。这是否可以不重新膨胀? 维基上说 注意:如果不使用示例启动solr,请确保在创建集合之前将

    • 我有一个名为的现有表。在这个表中,我有5列: persionId 人名 PMid 描述 Pamt 创建此表时,我将和设置为主键。 我现在想在主键中再包含一列——PMID。我如何编写一个语句来做到这一点?(表中已经有1000条记录了)

    • 问题内容: 如何添加到MySQL表的现有列? 问题答案: 我认为您想按照命令中的说明进行操作。可能是这样的: 在上面运行之前,请确保该列具有主索引。

    • 如果我在 SQL Server 2008 中使用以下 SQL 命令来更新具有外键约束的表: 是表中我的FK列。我正在尝试引用我的表中的。我收到这个错误: 外键“UserID”引用引用表“员工”中的无效列“UserID”。

    • 我在生产中有一个基于Hibernate的应用程序,有一个大型数据库。我需要在这个应用程序中向两个实体(两个表)添加审计,我决定使用Envers。 对于每次插入、更新或删除,Envers都会向实体的审核表中添加一条新记录。 如果从应用程序一开始就支持Envers,那么审计表将在实体创建(INSERT)时填充。 Envers留档非常薄,没有提到任何关于将Envers添加到现有应用程序的内容。 如果我简

    • 问题内容: 如果文件已经存在,我想在文件名中添加索引,这样我就不会覆盖它。 就像我有一个文件并且目标文件夹中同时存在一个文件一样-我需要复制文件名 并且如果我有一个文件,但是目的地文件夹包含和-生成的文件名必须是 因此,该功能与在Microsoft操作系统中创建文件夹非常相似。 最好的方法是什么? 问题答案: 未经测试的代码: