我在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毫秒。
哪一个是对的?任何人都可以解释这两个查询之间的区别吗?
答案 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