0

我在 lucene.Net 中存储数据我添加了一个包含多个字段的文档:

var doc = new Document();

doc.Add(new Field("CreationDate", dt, Field.Store.YES, Field.Index.ANALYZED));
doc.Add(new Field("FileName", path, Field.Store.YES, Field.Index.ANALYZED));
doc.Add(new Field("Directory", dtpath, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("Text", text.ToString(), Field.Store.YES, Field.Index.ANALYZED));
...
writer.AddDocument(doc);

我想浏览所有项目并为每个文档返回字段“CreationDate”和“Directory”。但是一个 Term 只能排除 1 个字段:

var termEnum = reader.Terms(new Term("CreationDate"));

我如何让它返回 2 个字段???

谢谢马丁

4

2 回答 2

1

当您遍历搜索结果时,读取文档并从中加载值:

int docId = hits[i].doc;  
Document doc = searcher.Doc(docId); 
String creationDate = doc.Get("CreationDate");
String directory = doc.get("Directory");
// ...and so on
于 2012-11-27T12:58:02.987 回答
0

您可以通过以下方式枚举包含给定术语的所有文档:

var termDocEnum = reader.TermDocs(new Term("CreationDate"));

您可以使用该枚举使用 docId 获取文档:

Document doc = searcher.doc(termDocEnum.doc);

这应该使使用Document API获取您正在寻找的信息变得足够容易。

请注意,如前所述,这只会获取给定术语具有指定值的文档!如果这是一个问题,您可以为每个相关参数调用一次 TermDocs 并根据需要合并集合(使用在 docId 上索引的哈希表或类似的东西很容易完成),或者不带参数调用 TermDocs,并使用seek找到适当的条款(如有必要,合并将再次手动完成)。

从“terms”方法传递的 TermEnum 不会给您一个 docId(我相信,您必须使用 termDocs 方法来获取枚举中的每个术语。)

于 2012-11-27T17:18:21.080 回答