【问题标题】:Set indexed attribute of a lucene field?设置 lucene 字段的索引属性?
【发布时间】:2013-06-01 01:26:24
【问题描述】:

我有一个由 3rd 方生成的大 lucene 索引。

我想搜索未编入索引的字段。是否可以重新创建索引,该字段现在已编入索引?

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    我假设该字段已存储正确?如果没有,那你就不走运了。

    如果它被存储,你有几个选择,我认为最简单的是:

    1. 将所有文档转储为 csv 输出 (see here)

    2. 将该字段的架构更改为 indexed=true

    3. 然后重新索引所有这些(csv 输出也可用于更新)

    【讨论】:

      【解决方案2】:

      解决了我自己,只使用一个索引阅读器和一个作家。 我不知道这是否是正确的方法。该字段是一个字符串字段(已存储),因此对于这种情况,它可以正常工作。

      IndexReader reader = IndexReader.open(...);
      IndexWriter writer = new IndexWriter(...);
      
      for(int i = 0; i < reader.maxDoc(); i++) {
          if(reader.isDeleted(i)) continue;
          Document d = reader.document(i);
          Document d2 = new Document();
          for(Field f : (List<Field>)d.getFields()) {
              Field f2 = f;
              if(f.name().equals(FIELD_NAME))
                  f2 = new Field(FIELD_NAME, f.stringValue(), Field.Store.YES, Field.Index.NOT_ANALYZED);
              d2.add(f2);
          }
          writer.addDocument(d2);
      }
      
      writer.optimize();
      writer.close();
      

      【讨论】:

      • 您应该注意,这只会获取文档的存储字段。使用这种方法,索引但未存储的字段将丢失。这对于您的情况可能没问题,但对于大型内容繁重的字段仅被索引是相当典型的。
      • 为了知识,这种情况有没有有效的方法?
      • 如果您可以控制索引的构建方式,请将相关字段更改为被索引。如果您不控制索引构建过程,您可以像您在那里所做的那样做,但将其作为二级索引保留,仅用于此类搜索,并在主索引中存储指向适当记录的指针(不是文档编号)。您无法真正从索引中重建未存储的数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 2016-02-18
      • 2011-05-10
      • 2011-01-25
      • 2012-01-02
      • 2019-09-15
      相关资源
      最近更新 更多