计算工作缓慢的单词出现次数 BaseX xquery
Count number of word occurrences working slow BaseX xquery
我想计算 XML 文档中单词的出现次数,查询给出实际计数,但速度很慢。
只有两个 xml 文件大小(236 KB、155 KB),生成结果需要 17 秒。
下面是查询:
let $doc := db:open('test','/ieee/test.xml')
let $tokens := $doc//text()/fn:tokenize(fn:normalize-space(.),'\s')
let $stringtoken := for $x at $pos in $tokens[position() = 1 to fn:last()-1]
let $y := string-join($tokens[position() = $pos to $pos + 1],' ')
return $y
return
<results>
{
for $result in distinct-values($stringtoken)
let $count := count($stringtoken[. = $result])
return
<term word="{$result}" count="{$count}"></term>
}
</results>
在上面的查询中,让 $count := count($stringtoken[. = $result]) 花费了太多时间。
非常感谢任何改进代码性能的建议。
group by
语句将大大加快您的查询速度:
return <results>{
for $grouped-token in $stringtoken
group by $token := $grouped-token
let $count := count($grouped-token)
return <term word="{ $token }" count="{ $count }"/>
}</results>
我想计算 XML 文档中单词的出现次数,查询给出实际计数,但速度很慢。
只有两个 xml 文件大小(236 KB、155 KB),生成结果需要 17 秒。
下面是查询:
let $doc := db:open('test','/ieee/test.xml')
let $tokens := $doc//text()/fn:tokenize(fn:normalize-space(.),'\s')
let $stringtoken := for $x at $pos in $tokens[position() = 1 to fn:last()-1]
let $y := string-join($tokens[position() = $pos to $pos + 1],' ')
return $y
return
<results>
{
for $result in distinct-values($stringtoken)
let $count := count($stringtoken[. = $result])
return
<term word="{$result}" count="{$count}"></term>
}
</results>
在上面的查询中,让 $count := count($stringtoken[. = $result]) 花费了太多时间。
非常感谢任何改进代码性能的建议。
group by
语句将大大加快您的查询速度:
return <results>{
for $grouped-token in $stringtoken
group by $token := $grouped-token
let $count := count($grouped-token)
return <term word="{ $token }" count="{ $count }"/>
}</results>