Lucene.net - TopDocs缺少totalHits?

时间:2012-06-27 22:46:30

标签: c# asp.net vb.net lucene lucene.net

我使用NuGet Package Manager下载了Lucene.net 2.9.4.1,并使用以下代码创建测试索引:

Dim sysDir As New System.IO.DirectoryInfo(Server.MapPath("~/index"))
Dim indexDir As Store.Directory = Store.FSDirectory.Open(sysDir)
Dim analyzer As Analysis.Analyzer = New Analysis.Standard.StandardAnalyzer(Util.Version.LUCENE_29)
Dim indexWriter As Index.IndexWriter = New Index.IndexWriter(indexDir, analyzer, True, Index.IndexWriter.MaxFieldLength.UNLIMITED)

Dim doc As Documents.Document = New Documents.Document()
Dim fldContent As Documents.Field = New Documents.Field("content", "The quick brown fox jumps over the lazy dog", Documents.Field.Store.YES, Documents.Field.Index.ANALYZED, Documents.Field.TermVector.YES)
doc.Add(fldContent)

indexWriter.AddDocument(doc)
indexWriter.Optimize()

indexWriter.Close()
indexDir.Close()

接下来,当我编写用于执行搜索的代码时,我无法访问TopDocs类的totalHits属性。这是代码:

Dim sysDir As New System.IO.DirectoryInfo(Server.MapPath("~/index"))
Dim indexDir As Store.Directory = Store.FSDirectory.Open(sysDir)
Dim searcher As Search.IndexSearcher = New Search.IndexSearcher(indexDir, True)

Dim searchTerm As Index.Term = New Index.Term("content", "fox")
Dim query As Search.Query = New Search.TermQuery(searchTerm)
Dim tdocs As Search.TopDocs = searcher.Search(query, Nothing, 100)

当我在下一行输入“tdocs”后跟一个点时,我只能访问GetMaxScore和SetMaxScore方法以及MaxScore属性 - 我没有看到任何显示“totalHits”的属性。

我错过了什么吗?有没有人有一些示例代码,他们使用的是Lucene.net.Search.TopDocs而不是Lucene.net.Search.Hits(据说是过时的)。

3 个答案:

答案 0 :(得分:2)

那是因为你使用VB,目前Lucene不符合CLS。

认为它与该错误有关,将在下一版本中修复。 https://issues.apache.org/jira/browse/LUCENENET-476

答案 1 :(得分:1)

以下是示例C#代码:

TopDocs topDocs = searcher.Search(query, luceneHitsLimit);
if (topDocs != null) {
    int totalResults = topDocs.totalHits;
    ScoreDoc[] scoreDocs = topDocs.scoreDocs;
    foreach(ScoreDoc scoreDoc in scoreDocs) {
        Document doc = searcher.Doc(scoreDoc.doc);
        ...
    }
}

答案 2 :(得分:0)

我知道这可能有点晚了,但希望它可以在将来帮助你或其他人。

要解决2.9.4中的问题,我在TopDocs类中编辑了源代码。它不起作用的原因是VB不区分大小写,而C#(我们都知道)。

TopDocs类有一个totalHits int属性和一个TotalHits int属性。在查看代码后,我意识到TotalHits属性只是获取/设置totalHits变量。所以我只是将totalHits变量的名称更改为类中的totalHits_obsolete,然后重建了库。

一旦构建,我的另一个项目就能够从我的VB.Net代码访问TotalHits属性。