【问题标题】:Getting the Doc ID in Lucene在 Lucene 中获取文档 ID
【发布时间】:2010-11-20 18:27:04
【问题描述】:

在 lucene 中,我可以做到以下几点

doc.GetField("mycustomfield").StringValue();

这会检索索引文档中列的值。

我的问题,对于同样的'doc',有没有办法获得Doc. Id?卢克展示了它,因此必须有办法解决这个问题。我需要它来删除有关更新的文档。

我搜索了文档,但没有找到要在 GetField 中使用的术语,或者是否已经有其他方法。

【问题讨论】:

  • 内部 Lucene id 不是一成不变的。删除文档的更好方法是将唯一 id 存储为文档的字段之一,并使用其值进行删除。
  • 由于 Lucene 3.0 Hits 类已被弃用,有人可以建议,如何在后续版本中获取 doc id?谢谢。

标签: .net lucene lucene.net


【解决方案1】:

原来你必须这样做:

var hits = searcher.Search(query);
var result = hits.Id(0);

相对于

var results = hits.Doc(i);
var docid = results.<...> //there's nothing I could find there to do this

【讨论】:

    【解决方案2】:

    我怀疑您无法找到任何有关确定特定 Lucene 文档 id 的文档的原因是因为它们不是真正的“id”。换句话说,它们不一定要被查找和存储以供以后使用。事实上,如果这样做,您将不会得到您希望的结果,因为在优化索引时 ID 会发生变化。

    相反,将 ID 视为特定文档相对于索引开头的当前“偏移量”,当已删除的文档从索引文件中物理删除时,该偏移量会发生变化。

    话虽如此,查找文档“id”的正确方法是:

    
    QueryParser parser = new QueryParser(...);
    IndexSearcher searcher = new IndexSearcher(...);
    Hits hits = searcher.Search(parser.Parse(...);
    
    for (int i = 0; i < hits.Length(); i++)
    {
       int id = hits.Id(i);
    
       // do stuff
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 2011-03-19
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      相关资源
      最近更新 更多