Lucene.Net - 如何检索单个文档

Lucene.Net - how to retrieve a single Document

在 Lucene.Net 中,如何根据字段值检索单个文档?在这种情况下,字段值对于单个文档将始终是唯一的。

我希望使用的字段是 "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?

您可以使用查询解析器,这是在 lucene 中添加文档的更好方法,我在许多项目中使用它来创建索引,

doc.Add(new Field("Id", searchResult.Id,Field.Store.YES, Field.Index.ANALYZED_NO_NORMS));    

正在使用 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;