C# 如何读取Lucene.net返回的查询结果

C# 如何读取Lucene.net返回的查询结果,c#,asp.net,.net,lucene,lucene.net,C#,Asp.net,.net,Lucene,Lucene.net,我不知道如何读取Lucene.net查询返回的结果 我有以下代码: 初始化 var test = new Document(); test.Add(new Field("id", "1", Field.Store.YES, Field.Index.NOT_ANALYZED)); test.Add(new Field("title", "the title", Field.Store.YES, Field.Index.ANALYZED));

我不知道如何读取Lucene.net查询返回的结果

我有以下代码:

初始化

  var test = new Document();
            test.Add(new Field("id", "1", Field.Store.YES, Field.Index.NOT_ANALYZED));
            test.Add(new Field("title", "the title", Field.Store.YES, Field.Index.ANALYZED));
            test.Add(new Field("body", "the body of the question", Field.Store.YES, Field.Index.ANALYZED));

            string path = HttpRuntime.AppDomainAppPath + "\\LuceneIndex";
            Lucene.Net.Store.Directory directory = FSDirectory.Open(new DirectoryInfo(path));
            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);

            var writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
            writer.AddDocument(test);

            writer.Optimize();
            writer.Flush(true, true, true);
            writer.Dispose();

            directory.Dispose();
            analyzer.Dispose();
读取数据

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);

QueryParser parser = new QueryParser(Version.LUCENE_30, "ti", analyzer);

string path = HttpRuntime.AppDomainAppPath + "\\LuceneIndex";
Lucene.Net.Store.Directory directory = FSDirectory.Open(new DirectoryInfo(path));

IndexSearcher searcher = new IndexSearcher(directory);

Query query = new TermQuery(new Term("body", "body"));


TopDocs docs =  searcher.Search(query,5);
analyzer.Dispose();
searcher.Dispose();

我检查了
文档中的数据,但它不包含匹配搜索结果的Id。

您可以按如下方式获取结果:

IndexSearcher searcher=newindexsearcher(目录);
查询查询=新术语查询(新术语(“正文”、“正文”));
TopDocs=searcher.Search(查询,5);
//获取顶级文档的id和分数
ScoreDocs[]结果=docs.ScoreDocs
foreach(结果中的ScoreDoc项)
{
//获取lucene docID
int luceneID=item.Doc
//从索引中获取文档ID的实际文档
Document doc=searcher.doc(luceneID);
}

Lucene(.Net)对索引文档有自己独特的docid,它独立于ID字段中存储的ID。您可以通过调用
searcher.Doc(int-docID)
访问实际文档及其存储字段,或者对于
IndexReader
,您可以调用
reader.Doc(int-docID)

您的查询字符串
ti
,它与索引中的任何内容都不匹配。您是否知道
StandardAnalyzer
执行的标记化,以及一般的分析器是什么?@lucastrezesniewski文档的TotalHits为1,因此我假设它找到了文档。我不知道StandardAnalyzerHmm执行的标记化。。老实说,我不明白为什么存储在索引中的文档会与查询匹配。查询解析器生成一个
TermQuery
,它只能匹配一个完整的术语——在您的例子中,它大致相当于一个完整的单词。如果你不知道分析仪是做什么的,我建议你读一读,因为了解它非常重要。此外,您还可以使用Luke工具查看索引中存储的内容。