2010-12-07 87 views
2

我已經得到了下面的方法(例如,從this link拍攝)爲什麼我Lucene.Net「點擊」採集長度返回「0」

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的長度,並表示

兒童不能evalua泰德


第一張截圖
alt text


第二個屏幕
alt text

我不知道這意味着什麼,但是,再查詢的結果總是被返回的單個記錄。即使我知道一個事實,即不止一個人應該被退回。


如果您想閱讀整個服務,請在下方張貼。

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

什麼是您搜索時「搜索查詢」的示例值? – Justin 2010-12-07 03:04:35

+0

我編輯了問題以刪除該行。我使用簡化版本的查詢得到了相同的結果。 – 2010-12-07 03:25:27

回答

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 
0
Dim HC = hits.Length 

長度是一種方法,而不是一個性質,它應該讀

Dim HC = hits.Length()