我有一个用lucene.net编写的asp.net程序。首先,我从28000个文档创建一个索引。 其次我正在执行搜索,但有时会出错。 (我认为当有很多结果时会抛出这个错误)
代码的重要部分:
Dim hits As Hits = searcher.Search(query)
Dim results As Integer = hits.Length() 'ergebnisse (größe der hits)
'#####################
'####### RESULTS #####
'#####################
trefferanzahl = results
If (results > 0) Then
Dim i As Integer
Dim h As Integer = results - 1
ReDim array_results(h, 6) 'array zum speichern von den "feldern"
Dim cellX As New TableCell()
For i = 0 To results - 1 Step 1
Dim tmpdoc As Document = hits.Doc(i) ' HERE THE ERROR!
Dim score As Double = hits.Score(i)
MsgBox("2. Docname: " & hits.Doc(i).Get("title"))
array_results(i, 0) = tmpdoc.Get("title")
array_results(i, 0) += tmpdoc.Get("doc_typ")
array_results(i, 1) = tmpdoc.Get("pfad")
array_results(i, 2) = tmpdoc.Get("date_of_create")
array_results(i, 3) = tmpdoc.Get("last_change")
array_results(i, 4) = tmpdoc.Get("id")
array_results(i, 5) = tmpdoc.Get("doc_typ")
array_results(i, 6) = CStr(score)
Next
' Load this data only once.
ItemsGrid.DataSource = CreateDataSource()
ItemsGrid.DataBind()
Else
bool_Suchergebnis = False
End If
searcher.Close()
提前致谢
答案 0 :(得分:3)
在非常大的集合中执行搜索时,一个很好的原则是尽快限制您正在处理的结果。我将假设您正在网格中实现分页。我们假设PageSize是20。
您需要做的是确保您可以访问此方法中的PageSize和当前PageNo。然后在结果集中使用Linq到Take(PageSize)和Skip(PageNo * PageSize)。然后你只需要处理20条记录。
然后,您有两个选择。如果直接绑定到数组,您可能可以使用空项,但我不确定,因此您可能必须将虚拟项放入数据源数组中所有不会显示的位置。不理想,但肯定比处理1000次点击更快。
第二个选项是只将20个项目绑定到网格,这将是快速的,关闭网格上的分页,因为它只显示一个页面,然后实现自己的分页行为,因为你知道PageSize,和当前页面。这将需要更多的工作,但它将比开箱即用的gridview绑定到大型数据源的执行速度快得多。
它将帮助您解决记忆问题。