在Lucene.Net中,如何根据Field值检索单个Document?在这种情况下,Field值对于单个文档始终是唯一的。
我希望使用的字段是“Id”,这是我的文档的结构:
var doc = new Document();
// Add lucene fields mapped to DB fields
doc.Add(new Field("Id", searchResult.Id, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("Name", searchResult.Name, Field.Store.YES, Field.Index.ANALYZED));
doc.Add(new Field("Region", searchResult.Region, Field.Store.YES, Field.Index.ANALYZED));
doc.Add(new Field("Type", searchResult.Type, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("Permalink", searchResult.Permalink, Field.Store.YES, Field.Index.NOT_ANALYZED));
我可以找到许多搜索Lucene以获得多个结果的示例,但没有用于检索单个项目的示例。我确信它必须是可能的,因为我认为仅更新Lucene中的特定文档是必需的。
我想第一步是将“Id”字段更改为ANALYZED而不是NOT_ANALYZED并重建索引。
我觉得可能有一个很好的简单方法我还没有找到用于检索单个文档而不是使用QueryParser?
答案 0 :(得分:1)
你可以使用查询解析器在lucene中更好的方法来添加文档,我用它在许多项目中创建索引,
doc.Add(new Field("Id", searchResult.Id,Field.Store.YES, Field.Index.ANALYZED_NO_NORMS));
答案 1 :(得分:0)
使用Lucene.Net 3.0.3
//Set up
var directory = FSDirectory.Open(new DirectoryInfo("/path/to/your/index"));
var reader = IndexReader.Open(directory, false);
var searcher = new IndexSearcher(reader);
//find your document location
var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
var query = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "_id", analyzer).Parse("_id:1");
var result = searcher.Search(query, 1).ScoreDocs.FirstOrDefault();
//Fetch a document by index number. This index number is stored as an integer in result.Doc
Document d = searcher.Doc(result.Doc);
//return
return d;