Arv*_* Kr 1 marklogic marklogic-8 marklogic-9
我正在做一些锻炼以找出性能方面哪个更好,无论是元素值查询还是路径范围查询。
我发现使用路径范围查询的搜索比元素值查询慢一点。
即使加载了额外的路径范围索引,有没有人知道使用路径范围查询搜索的速度缓慢。
我使用了下面的代码。
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")
Run Code Online (Sandbox Code Playgroud)
在使用路径范围查询时,我应该考虑哪些特定的事情
任何建议都将受到高度赞赏,因为它有助于我们设计高效的搜索代码。
小智 5
在过滤查询中,需要遍历每个候选匹配文档以检查匹配。要验证元素范围匹配,我们只需要查看元素的名称,然后查看其内容(如果名称匹配)。要验证路径范围匹配,我们需要确保当前元素的名称与路径的末尾匹配,然后(在这种情况下)其父元素名称匹配,然后该父元素位于根。这不是更多的工作,而是更多的工作。索引同样需要做更多的工作来知道要索引哪些元素内容。
但是您也在以不同的方式进行苹果与橙子的比较:值查询与范围相等查询不同,因为值查询是全文查询——词干和标记化,通常忽略空格和标点符号——以及范围相等查询是使用排序规则的字符串比较。对于一个简单的值查询,很多工作可以通过键来完成,而不是字符串比较,但它会做额外的词干提取工作。另一方面,我们在范围查询端进行字符串比较,对于非代码点整理,这些比较可能会有所涉及。
如果您的文档包含fname
不在下面的元素,那么路径范围索引将是一个胜利,name
因此可以通过索引解析将它们排除在外,并且过滤器甚至不需要考虑它们。
我的一般建议是: 1. 衡量,因为它从来不是你想的那样 2. 经验法则:选择限制最少的指标,你需要做出你关心的区别。即,如果您的所有fname
元素始终都在 之下name
,则不要放入name
您的路径中,因为它只会增加工作量。3. 值查询只是单词查询,添加了“必须匹配元素的整个范围”约束;不要将它们视为字符串相等。使用范围索引进行字符串比较,但请为您的用例选择最无聊的排序规则。
归档时间: |
|
查看次数: |
134 次 |
最近记录: |