【问题标题】:what is the difference between these two XQueries这两个 XQuery 有什么区别
【发布时间】:2012-08-03 07:40:51
【问题描述】:

我有一个巨大的 XML 文件存储在 BaseX 中。 以下是XML节点的结构

Datas   (Parent Node)
  - Data  (Child of above)
     - Desc  (Child of above)
        - P    (Child of above) and contains the actual text 

P 标签包含所有文本,我必须计算特定单词的出现次数 在P 标签内。

我创建了全文索引。现在要计算特定单词的出现次数,我使用以下 2 个查询

ft:count(doc('BHCR')/Datas/Data/Desc[. contains text 'revolution'])

此查询返回 2177,耗时 25 秒。

另一个

ft:count(doc('BHCR')/Datas/Data/Desc[text() contains text 'revolution'])

此查询返回 3684 并花费了 52 毫秒。

哪一个是对的?谁能解释一下这两个查询的区别?

【问题讨论】:

    标签: xml xpath xquery basex


    【解决方案1】:

    在您的第一个查询中,上下文项. 将导致元素的所有文本节点的合并(即,创建其字符串值),然后将使用该元素查找全文标记。这种合并可能会产生新的关键字。例如,以下查询将返回 true...

    <xml><b>H</b>i</xml>/. contains text 'hi'
    

    ..where as 以下查询将返回 true...

    <xml><b>H</b>i</xml> contains text 'hi'
    

    由于新的关键字不能存储在全文索引中,所以不会进行索引访问,查询时间会更长。

    您的第二个查询将返回所有在其子文​​本节点中具有revolutionDesc 元素。如果您想解析 Desc 元素的所有降序文本,以下查询将为您提供预期的结果:

    ft:count(doc('BHCR')/Datas/Data/Desc[.//text() contains text 'revolution']
    

    BaseX 文档中的Full Text: Mixed Context 部分将为您提供更多详细信息。

    希望这会有所帮助,克里斯蒂安

    【讨论】:

    • Christian- 感谢您的回复。嗯,现在我明白了。顺便说一句,您的查询耗时 88 毫秒,计数为 3684。再次感谢:)
    猜你喜欢
    • 2012-06-12
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2020-10-10
    相关资源
    最近更新 更多