这两个XQueries有什么区别

时间:2012-08-03 07:40:52

标签: xml xpath xquery basex

我在BaseX中存储了一个巨大的XML文件。 以下是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毫秒。

哪一个是对的?任何人都可以解释这两个查询之间的区别吗?

1 个答案:

答案 0 :(得分:2)

在第一个查询中,上下文项.将导致元素的所有文本节点合并(即创建其字符串值),然后用于查找全文令牌。此合并可以生成新关键字。例如,以下查询将返回true ...

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

..其中以下查询将返回true ...

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

由于新关键字无法存储在全文索引中,因此不会进行索引访问,查询将花费更长时间。

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

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

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

希望这会有所帮助,Christian