HCL 中文技术社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2605|回复: 0

db.search和db.ftsearch孰快?

[复制链接] TA的帖子

91

主题

123

帖子

2599

积分

超级版主

Rank: 8Rank: 8

积分
2599

活跃会员热心会员灌水之王最佳新人

发表于 2020-11-2 21:51:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

41.png

在里面筛选出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,大约花了一秒不到

42.png


紧接着,我们采用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,也是一秒不到:

43.png

结论,在硬件如固态磁盘和Domino平台为V11.0.1版本,数据库ODS为52,数据不大,如数据量在10w到15w左右,db.ftSearch和db.search速度相差无几,如果是这样,我倒是建议使用db.search。
当然,你的环境可能很复杂,而且磁盘是机械硬盘,并且存在着大量碎片,影响测试结果,你也可以尝试下DQL,毕竟按官方说法,DQL可能更快。

回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

QQ|手机版|小黑屋|HCL 中文技术社区 ( 沪ICP备17044822号 )

GMT+8, 2023-12-12 06:42 , Processed in 1.056447 second(s), 25 queries .

快速回复 返回顶部 返回列表