马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
大家好,才是真的好。
今天我们讲点LotusScript开发知识,文末还有小小的彩蛋。
在LotusScript中常会进行文档查找,而后返回文档的集合,再依次定位文档处理。
今天的重点是查找。文档查找一般大家会使用db.FTSearch(包括view.ftsearch)、db.Search、view.GetAllDocumentsByKey、view.GetDocumentByKey等方法。
当然会有杠精说,不是还有DQL吗?
是的,DQL可以在V10或更高版本中使用,而且效率相当不错。本篇比较的是传统搜索方式,这样的话,从R5一直到V11版本都可以拿出来使用。
从查找速度来上说,肯定view.GetAllDocumentsByKey、view.GetDocumentByKey最快,但需额外创建用来进行查询的视图,视图会产生系统开销,如视图索引占用磁盘空间,定期更新消耗的资源等,这意味着更低的性能。如一个数据库中存放超过200个视图,可能慢得让你胸闷气短。
对于一个不是特别熟悉结构的数据库来说,db.ftSearch、db.Search最为适用。
先说区别,db.ftSearch使用全文本索引进行搜索,可以搜索富文本域或附件中的内容,但需要创建索引,并且大多数时候你可能搜索不到最新的数据,如果你的数据经常变动,可能就不适用了,毕竟索引要定时进行更新。这一情况在v10和以上的版本得到一些缓解,但不管怎样,需要额外性能来维护索引,同时搜索的条件也有特定的语法,最后返回的文档最大数限制在5000个,你也可以通过在notes.ini中设置FT_MAX_SEARCH_RESULTS语句来扩大最大返回文档数,总的来说最大是2,147,483,647个……
另外,db.search直接对文档进行公式搜索,也就是说,搜索条件可以是公式。虽说搜索原理是对数据库中每个文档进行公式判断,而后再返回结果,但其实性能并不算差,绝大多数时候够用,当你没有权限创建全文索引,或全文索引经常损坏出现问题,db.search可是唯一的选择哦。
再说看测试测试过程,首先数据库ODS为52,第一次测试文档为12w+,我们采用了Domino V11.0.1版本, 并且将数据库ODS格式升级为52
在里面筛选出firstname为Aagje的用户,我们现在采用dbsearch,以代理运行,代码如下:
Dim ns As New NotesSession Dim db As NotesDatabase Dim dc As NotesDocumentCollection Dim doc As NotesDocument Dim searchstr As String Dim i% Set db=ns.GetDatabase(ns.CurrentDatabase.Server,"fakenames.nsf") Dim startdt As NotesDateTime Dim enddt As NotesDateTime Set startdt=ns.CreateDateTime("") Set enddt=ns.CreateDateTime("") Call startdt.SetNow() MsgBox "***********我要开始执行DBSearch搜索啦**************" MsgBox "开始执行时间为:" & startdt.LSLocalTime searchstr={form="contact" & firstname="Aagje"} If db.IsOpen Then Set dc=db.search(searchstr,Nothing,0) Print dc.Count Set doc=dc.GetFirstDocument for i%=1 To dc.Count Set doc=dc.GetNextDocument(doc) Next
End If Call enddt.SetNow() MsgBox "执行结束时间为:" & enddt.LSLocalTime MsgBox "***********DBSearch搜索结束**************" MsgBox "共计花费" & CStr(enddt.TimeDifferenceDouble(startdt)) & "秒"
返回文档数据为7,大约花了一秒不到
紧接着,我们采用FTSearch进行运行搜索,代码如下图
Dim ns As New NotesSession Dim db As NotesDatabase Dim dc As NotesDocumentCollection Dim doc As NotesDocument Dim searchstr As String Dim i%
Set db=ns.GetDatabase(ns.CurrentDatabase.Server,"fakenames.nsf") Dim startdt As NotesDateTime Dim enddt As NotesDateTime
Set startdt=ns.CreateDateTime("") Set enddt=ns.CreateDateTime("") Call startdt.SetNow()
MsgBox "***********我要开始执行FTSearch搜索啦**************" MsgBox "开始执行时间为:" & startdt.LSLocalTime searchstr={[form] ="contact" and [firstname]="Aagje"}
If db.IsOpen Then
Set dc=db.Ftsearch(searchstr, 0) Print dc.Count Set doc=dc.GetFirstDocument for i%=1 To dc.Count Set doc=dc.GetNextDocument(doc) Next
End If Call enddt.SetNow()
MsgBox "执行结束时间为:" & enddt.LSLocalTime MsgBox "***********FTSearch搜索结束**************" MsgBox "共计花费" & CStr(enddt.TimeDifferenceDouble(startdt)) & "秒"
在更新全文索引之后,同样在里面筛选出firstname为Aagje的用户,返回文档数据依旧为7,也是一秒不到:
结论,在硬件如固态磁盘和Domino平台为V11.0.1版本,数据库ODS为52,数据不大,如数据量在10w到15w左右,db.ftSearch和db.search速度相差无几,如果是这样,我倒是建议使用db.search。
当然,你的环境可能很复杂,而且磁盘是机械硬盘,并且存在着大量碎片,影响测试结果,你也可以尝试下DQL,毕竟按官方说法,DQL可能更快。
|