【问题标题】:Iterate through all undeleted Documents in a Lucene (.Net) index遍历 Lucene (.Net) 索引中所有未删除的文档
【发布时间】:2010-12-02 23:24:27
【问题描述】:

我想获取 Lucene (.Net 2.4) 索引的所有未删除文档的计数,然后读取我存储的所有或一系列这些文档的字段。 阅读 Lucene 帮助后,我不太确定 IndexReader.NumDocs() 是返回所有文档的计数还是仅返回未删除的文档。我可以简单地遍历 IndexReader.Document[] 或者它是否包含已删除的文档?

如果 NumDocs() 和 Docmuent[] 确实 包含已删除和未删除的文档,我想我必须这样做:

int totalCount = reader.NumDocs();
int totalCountUndeleted = totalCount;
for (int iDoc = 0; iDoc < totalCount; iDoc++)
  if (reader.IsDeleted(iDoc))
    totalCountUndeleted--;

for (int iDoc = 0; iDoc < totalCount; iDoc++)
{
  if (!reader.IsDeleted(iDoc))
  {
     Document doc = reader.Document(iDoc);
     // read fields
  }
}

这是正确的方法还是有其他可能的方法?谢谢

【问题讨论】:

  • 我找到了 reader.NumDeletedDocs()。所以获取 totalCount 更容易: int totalCount = reader.NumDocs() - reader.NumDeletedDocs();

标签: c# lucene lucene.net


【解决方案1】:

IndexReader.NumDocs 将为您提供活动文档的数量。 IndexReader.MaxDoc 是比索引中最大文档数大一的数字。以下代码将读取索引中的所有活动文档。

int max = reader.MaxDoc();
for (int iDoc = 0; iDoc < max; iDoc++)
{
  if (!reader.IsDeleted(iDoc))
  {
     Document doc = reader.Document(iDoc);
     // read fields
  }
}

【讨论】:

    【解决方案2】:

    这是正确的方法。在优化索引之前,不会删除文档。

    或者,如果您有类似*:* 的查询匹配所有文档,您可以运行它。查询方法可能会慢一些,但可能更标准。

    【讨论】:

    • 感谢您的回答。我尝试使用“:”(冒号)作为查询(Query indexQuery = parser.Parse(":"); )进行正常搜索,但它对我不起作用。 (ParseException 无法解析 ':':在第 1 行第 0 列遇到“”:“:”。期待以下之一: ... ...“+” ...“-” ... ":" ... "^" ... ... ... ... ... "[" ... "{" .. .
    • Lucene 文档声明您可以使用冒号指定要搜索的字段 ("FIELDNAME:searchstring")
    • @gumo:抱歉,SO 认为* 是一个关键字。你能做到*:*吗?
    • 非常感谢。使用 进行搜索(如何在 cmets 中进行格式化?)对我有用,谢谢。我认为这对我来说是最好的方式。
    • 仅供参考:我比较了这两种方式,使用 *:* 的搜索比迭代快 5 倍左右。 (并回答我自己的问题:cmets 中的格式可以用“`”完成)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多