我正在做一些锻炼,以找出性能方面的明智选择,无论是元素值查询还是路径范围查询。
我发现使用路径范围查询进行搜索要比元素值查询慢一点。
有人对路径范围查询的搜索速度是否有任何想法,即使它加载了额外的路径范围索引。
我使用了以下代码。
xdmp:document-delete("/aname4.xml")
xdmp:document-insert("/aname1.xml",
<name><fname>John</fname><mname>Rob</mname><lname>Goldings</lname></name>),
xdmp:document-insert("/aname2.xml",
<name><fname>Jim</fname><mname>Ken</mname><lname>Kurla</lname></name>),
xdmp:document-insert("/aname3.xml",
<name><fname>Ooi</fname><mname>Ben</mname><lname>Fu</lname></name>),
xdmp:document-insert("/aname4.xml",
<name><fname>James</fname><mname>Rick</mname><lname>Tod</lname></name>)
create path range index "/name/fname"
checked response time with following search code
cts:search(doc(),cts:path-range-query("/name/fname","=","Jim"),"filtered")
cts:search(doc(),
cts:element-value-query(xs:QName("fname"),"jim"),
"filtered")
在使用路径范围查询时是否应该考虑一些具体的事情
任何建议都会受到高度赞赏,因为它有助于我们设计有效的搜索代码。
答案 0 :(得分:5)
在经过过滤的查询中,需要遍历每个候选匹配文档以检查是否匹配。要验证元素范围匹配,我们只需要查看元素的名称,然后查看其内容(如果名称匹配)。要验证路径范围匹配,我们需要确保当前元素的名称与路径的末尾匹配,然后(在这种情况下)确保其父元素名称匹配,然后该父元素位于根。这不是更多的工作,而是更多的工作。类似地,建立索引需要做更多的工作才能知道要索引的元素内容。
但是您还以不同的方式进行了苹果与橘子的比较:值查询与范围相等查询不同,因为值查询是全文查询-词干和标记化,并且通常忽略空格和标点符号-范围相等查询是使用排序规则的字符串比较。对于简单的值查询,可以通过键而不是字符串比较来完成很多工作,但是这样做会产生额外的阻塞工作。另一方面,我们在范围查询端进行字符串比较,对于非代码点排序规则,这些比较可能会涉及到一些。
如果您的文档中有fname
个元素不在name
下,那么可以通过索引解析将其排除,并且过滤器甚至不需要考虑他们。
我在这里的一般建议是:
1.测量,因为它永远不会是您的想法
2.经验法则:选择您需要进行区分的最严格的索引。也就是说,如果您所有的fname
元素都始终位于name
下,则不要在路径中放入name
,因为这只会增加工作量。
3.值查询只是带有附加的“必须匹配元素的整个范围”约束的单词查询;不要将它们视为字符串相等。使用范围索引进行字符串比较,但要选择适合您使用情况的最无聊的排序规则。