在Lucene的,我可以做以下获取文档ID在Lucene的
doc.GetField("mycustomfield").StringValue();
这检索列的索引的文档中的值。
我的问题,对于相同的'doc'
,有没有办法获得Doc. Id
?卢克显示它,因此必须有一种方法来解决这个问题。我需要它删除更新文件。
我搜索了文档,但没有找到在GetField中使用的术语,或者如果已经存在另一种方法。
在Lucene的,我可以做以下获取文档ID在Lucene的
doc.GetField("mycustomfield").StringValue();
这检索列的索引的文档中的值。
我的问题,对于相同的'doc'
,有没有办法获得Doc. Id
?卢克显示它,因此必须有一种方法来解决这个问题。我需要它删除更新文件。
我搜索了文档,但没有找到在GetField中使用的术语,或者如果已经存在另一种方法。
原来你必须这样做:
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
我怀疑您无法在确定特定的Lucene文件的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
}
内Lucene的ID不是一成不变的。删除文档的更好方法是将唯一标识存储为文档字段之一,并使用其值删除。 – 2009-08-19 06:07:46
由于在Lucene 3.0 Hits类已被弃用,有人可以建议,如何获得更多版本的文档ID?谢谢。 – Emma 2013-07-11 05:42:50