3

我有一个巨大的 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 毫秒。

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

4

1 回答 1

3

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

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

..where as 以下查询将返回 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 文档中的全文:混合上下文部分将为您提供更多详细信息

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

于 2012-08-03T08:07:22.313 回答