【问题标题】:Get intersection with element range index获取与元素范围索引的交集
【发布时间】:2016-05-12 12:09:34
【问题描述】:

如何以优化的方式获得现有元素范围索引和单词序列之间的交集?

我的重点是内存优化,我知道我可以使用 cts:element-values 获取数据并使用地图对象来完成这项工作。但是,如果有一个查询直接与缓存的范围索引进行此交集,为什么我应该这样做。

例如:

范围索引 (test1, test2, test3) /序列(test1,test4,test5)

查询结果 = test1

知道为单词列表创建的这个范围索引存在于一个文档中。我尽量避免将它们放在单独的文档中,以及避免使用碎片。

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    我相信这对你有用:

    let $myIndex := "myIndex"
    
    let $sequence := ("one", "two two", "three")
    
    let $or-query := cts:or-query(($sequence ! cts:word-query(.)))
    
    return
      cts:element-values(xs:QName($myIndex),(),(), cts:element-query(xs:QName($myIndex), $or-query ))
    

    根据您在下面的评论,这有点像 hack,但我能够通过以下方式实现我认为的预期结果:

    fn:distinct-values(
      cts:search(//lastname, 
          cts:or-query(($sequence ! 
             cts:element-query(xs:QName("lastname"), 
                cts:element-value-query(xs:QName("lastname"), ., "self")
             )
          ))
      )/string()
    )
    

    只需将开头的 XPath 更改为您想要的元素以及元素查询中的 QName。这是否比元素值和检查地图中的每个值更快,我无法告诉你。

    如果这些值真的只在一个文档中专门用于存储它们,您可以尝试的第三种方法是更改​​数据库碎片策略。然后我的方法#1应该有效。 [关于可能由此产生的意外后果的强制性免责声明]

    【讨论】:

    • 谢谢@Rob S.,如果在单独的文件中的话,我同意你的看法,这不是我的情况。此查询将返回所有范围索引条目。
    • 嗨@Ahmad Tamimi,用另一个sn-p代码更新了我的答案。祝你好运!
    • 嗨,@Rob S.,再次感谢您。这对我有用。但它比使用地图对象慢,因为此查询使用 xPath。但是,我相信您推荐的第三种方法将在不影响性能的情况下完成所需的工作。
    • 嗨@Ahmad Tamimi,我的理解是,在这种情况下,关于第一个参数的XPath 性能并非如此。 (您也可能摆脱 /string())。您应该会看到性能较慢,因为必须过滤 cts:search 调用,而 element-values 未过滤运行。我不确定 distinct-values 是否比检查地图中的键更快/更慢。这可能会因您要查找的字词的大小和结果的大小而异。如果您足够了解您的数据,您也可以完全删除 distinct-values。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多