我使用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(据说是过时的)。
答案 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属性。