我有以下方法(例子来自this link)
Public Function ReadIndex(ByVal q As String, ByVal page As Integer?) As List(Of Domain.[Event]) Implements ILuceneService.ReadIndex
''# This starts us at the first record if the user doesn't have a page specified
If page Is Nothing Then page = 0
Dim i As Integer = page
''# Variables used by Lucene
Dim reader As IndexReader = IndexReader.Open(luceneDirectory)
Dim searcher As IndexSearcher = New IndexSearcher(reader)
Dim query As Query = New TermQuery(New Term("fullText", q.ToLower))
Dim hits As Hits = searcher.Search(query)
Dim ResultIDs As List(Of Integer) = New List(Of Integer)
Dim HC = hits.Length ''# FOR DEBUGGING PURPOSES
While (i <= (page * 10) AndAlso i < hits.Length)
Dim document As Document = hits.Doc(i)
Dim score As Single = hits.Score(i)
ResultIDs.Add(document.[Get]("id"))
i += 1
End While
''# Self explanitory
searcher.Close()
Return EventService.QueryEvents().Where(Function(e) (ResultIDs.Contains(e.ID))).ToList()
End Function
但是当我在
处设置断点时 Dim HC = hits.Length ''# FOR DEBUGGING PURPOSES
并在调试器中对其进行分析,它总是说它的长度为0
并且说
无法评估儿童
第一个屏幕截图
第二个屏幕截图
我不确定这意味着什么,但是,查询的结果始终是返回的SINGLE记录。即使我知道应该返回多个事实。
如果您想阅读整个服务,请在下面发布。
Imports System.Web
Imports System.Text
Imports Lucene.Net.Index
Imports Lucene.Net.Search
Imports Lucene.Net.Documents
Imports Lucene.Net.Analysis.Standard
Imports Lucene.Net.Store
Namespace Domain
Public Class LuceneService : Implements ILuceneService
Private luceneDirectory As Directory = FSDirectory.GetDirectory(HttpContext.Current.Server.MapPath("~/App_Data/"), False)
Private ExceptionService As Domain.IExceptionService
Private EventService As Domain.EventService
Sub New()
ExceptionService = New Domain.ExceptionService(New Domain.ExceptionRepository)
EventService = New Domain.EventService(New Domain.EventRepository)
End Sub
Public Function AddIndex(ByVal searchableEvent As [Event]) As Boolean Implements ILuceneService.AddIndex
Dim builder As New StringBuilder
builder.Append(Trim(searchableEvent.Description))
builder.Append(" ")
builder.Append(Trim(searchableEvent.Title))
builder.Append(" ")
builder.Append(Trim(searchableEvent.Location.Name))
builder.Append(" ")
builder.Append(Trim(searchableEvent.Region.Region))
builder.Append(" ")
builder.Append(Trim(searchableEvent.StartDateTime.ToString("yyyy/MM/dd")))
builder.Append(" ")
builder.Append(Trim(searchableEvent.TicketPriceHigh.ToString))
builder.Append(" ")
builder.Append(Trim(searchableEvent.TicketPriceLow.ToString))
builder.Append(" ")
builder.Append(Trim(searchableEvent.URL))
builder.Append(" ")
builder.Append(Trim(searchableEvent.User.UserName))
CreateIndex()
Dim writer As New IndexWriter(luceneDirectory, New StandardAnalyzer(), False)
Dim doc As Document = New Document
doc.Add(New Field("id", searchableEvent.ID, Field.Store.YES, Field.Index.UN_TOKENIZED))
doc.Add(New Field("fullText", builder.ToString, Field.Store.YES, Field.Index.TOKENIZED))
doc.Add(New Field("user", searchableEvent.User.UserName, Field.Store.YES, Field.Index.UN_TOKENIZED))
doc.Add(New Field("location", searchableEvent.Location.Name, Field.Store.YES, Field.Index.UN_TOKENIZED))
doc.Add(New Field("date", searchableEvent.StartDateTime, Field.Store.YES, Field.Index.UN_TOKENIZED))
writer.AddDocument(doc)
writer.Optimize()
writer.Close()
Return True
End Function
Public Function DeleteIndex(ByVal searchableEvent As [Event]) As Boolean Implements ILuceneService.DeleteIndex
Throw New NotImplementedException
End Function
Public Function ReadIndex(ByVal q As String, ByVal page As Integer?) As List(Of Domain.[Event]) Implements ILuceneService.ReadIndex
Dim IDList As List(Of Integer) = New List(Of Integer)
If page Is Nothing Then page = 0
Dim i As Integer = page
''# Variables used by Lucene
Dim reader As IndexReader = IndexReader.Open(luceneDirectory)
Dim searcher As IndexSearcher = New IndexSearcher(reader)
Dim query As Query = New TermQuery(New Term("fullText", q.ToLower))
Dim hits As Hits = searcher.Search(query)
Dim HC = hits.Length ''# For Debugging Purposes
While (i <= (page * 10) AndAlso i < hits.Length())
Dim document As Document = hits.Doc(i)
Dim score As Single = hits.Score(i)
IDList.Add(document.[Get]("id"))
i += 1
End While
''# Self explanitory
searcher.Close()
Return EventService.QueryEvents().Where(Function(e) (IDList.Contains(e.ID))).ToList()
End Function
Public Function UpdateIndex(ByVal searchableEvent As [Event]) As Boolean Implements ILuceneService.UpdateIndex
Throw New NotImplementedException
End Function
Private Sub CreateIndex() Implements ILuceneService.CreateIndex
If Not IndexReader.IndexExists(HttpContext.Current.Server.MapPath("~/App_Data/")) Then
Dim writer As New IndexWriter(HttpContext.Current.Server.MapPath("~/App_Data/"), New StandardAnalyzer(), True)
writer.Close()
End If
End Sub
End Class
End Namespace
答案 0 :(得分:0)
Dim HC = hits.Length
长度是一种方法,而不是属性,它应该是
Dim HC = hits.Length()
答案 1 :(得分:0)
好像更新到v2.4并编辑我的代码已经解决了这个问题。
Public Function ReadIndex(ByVal q As String, ByVal page As Integer?) As Domain.Pocos.LuceneResults Implements ILuceneService.ReadIndex
''# A timer variable to determine now long the method executes for
Dim tStart As DateTime = DateTime.Now
''# Creates a container that we use to store all of the result ID's
Dim IDList As List(Of Integer) = New List(Of Integer)
''# First we set the initial page number.
''# If it'S null, it means it's zero
If (page Is Nothing) Or (page <= 0) Then page = 1
''# [i] is the variable we use to extract the appropriate (needed)
''# documents from the results. Its initial value is the page number
''# multiplied by the number of results we want to return (in our
''# case 10). The [last] variable is used to stop the while loop at
''# the 10th record by simply adding 9 to the [i] variable.
Dim i = (page - 1) * 10
Dim last As Integer = i + 9
''# Variables used by Lucene
Dim reader As IndexReader = IndexReader.Open(luceneDirectory)
Dim searcher As IndexSearcher = New IndexSearcher(reader)
Dim parser As QueryParser = New QueryParser("fullText", New StandardAnalyzer())
Dim query As Query = parser.Parse(q.ToLower)
''# We're using 10,000 as the maximum number of results to return
''# because I have a feeling that we'll never reach that full amount
''# anyways. And if we do, who in their right mind is going to page
''# through all of the results?
Dim topDocs As TopDocs = searcher.Search(query, Nothing, 10000)
Dim doc As Document = Nothing
''# loop through the topDocs and grab the appropriate 10 results based
''# on the submitted page number
While i <= last AndAlso i < topDocs.totalHits
doc = searcher.Doc(topDocs.scoreDocs(i).doc)
IDList.Add(doc.[Get]("id"))
i += 1
End While
''# Self explanitoryB
searcher.Close()
reader.Close()
Dim EventList As List(Of Domain.Event) = EventService.QueryEvents().Where(Function(e) (IDList.Contains(e.ID))).ToList()
Dim tStop As DateTime = DateTime.Now
''# Instead of just returning a list of results
''# I've decided to create a POCO that also contains
''# the number of results and how long the method took to execute.
Dim LucienResults As New Domain.Pocos.LuceneResults With {.EventList = EventList,
.ExecuteTime = (tStop - tStart),
.TotalResults = topDocs.totalHits}
Return LucienResults
End Function