0

我使用 NuGet 包管理器下载了 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(据说已经过时)。

4

3 回答 3

2

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

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

于 2012-06-28T18:40:55.247 回答
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);
        ...
    }
}
于 2012-06-28T10:15:06.693 回答
0

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

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

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

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

于 2012-07-20T19:23:22.937 回答