Marklogic:元素值查询与路径范围查询

时间:2019-11-05 15:08:41

标签: 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")

在使用路径范围查询时是否应该考虑一些具体的事情

任何建议都会受到高度赞赏,因为它有助于我们设计有效的搜索代码。

1 个答案:

答案 0 :(得分:5)

在经过过滤的查询中,需要遍历每个候选匹配文档以检查是否匹配。要验证元素范围匹配,我们只需要查看元素的名称,然后查看其内容(如果名称匹配)。要验证路径范围匹配,我们需要确保当前元素的名称与路径的末尾匹配,然后(在这种情况下)确保其父元素名称匹配,然后该父元素位于根。这不是更多的工作,而是更多的工作。类似地,建立索引需要做更多的工作才能知道要索引的元素内容。

但是您还以不同的方式进行了苹果与橘子的比较:值查询与范围相等查询不同,因为值查询是全文查询-词干和标记化,并且通常忽略空格和标点符号-范围相等查询是使用排序规则的字符串比较。对于简单的值查询,可以通过键而不是字符串比较来完成很多工作,但是这样做会产生额外的阻塞工作。另一方面,我们在范围查询端进行字符串比较,对于非代码点排序规则,这些比较可能会涉及到一些。

如果您的文档中有fname个元素不在name下,那么可以通过索引解析将其排除,并且过滤器甚至不需要考虑他们。

我在这里的一般建议是: 1.测量,因为它永远不会是您的想法 2.经验法则:选择您需要进行区分的最严格的索引。也就是说,如果您所有的fname元素都始终位于name下,则不要在路径中放入name,因为这只会增加工作量。 3.值查询只是带有附加的“必须匹配元素的整个范围”约束的单词查询;不要将它们视为字符串相等。使用范围索引进行字符串比较,但要选择适合您使用情况的最无聊的排序规则。