为什么我的Lucene.Net“点击”集合长度返回“0”

时间:2010-12-07 02:10:26

标签: .net lucene.net

我有以下方法(例子来自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并且说

  

无法评估儿童


第一个屏幕截图
alt text


第二个屏幕截图
alt text

我不确定这意味着什么,但是,查询的结果始终是返回的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

2 个答案:

答案 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