我有一个包含大致相同的XML文档的数据库:
<document>
<question_item>
<question>What is your name?</question>
</question_item>
<question_item>
<question>What is your address?</question>
</question_item>
...
</document>
我希望能够获取搜索字词,然后返回一个明确的问题列表,其中包含该字词的内容,例如:寻找&#34;名称&#34;使用上面的数据,会返回一个结果,&#34;你的名字是什么?&#34;。
我已使用fn:distinct-values
成功实现此功能,但显然效率不高。
我想用CTS实现这个。我尝试过以下方法:
for $question in cts:element-values(
xs:QName('question'),(),(),
cts:element-word-query(xs:QName("question"), "name"))
return $question
然而,这会引起一些问题,而这些问题没有&#34; name&#34;在问题文本中。例如在上面的示例中,返回了两个问题。我认为这是因为我正在使用的查询未经过滤传递,因此如果该片段存在匹配,它将从片段返回任何问题。
这个假设是否正确?
我能做些什么才能有效地实现我想做的事?
谢谢!
答案 0 :(得分:5)
那是对的; cts:element-values()
是一个词典类型的函数,因此它未经过滤运行。
最有效的方法是使用匹配的词典函数cts:element-value-match
:
cts:element-value-match(xs:QName('question'), "* name*")
问题在于,它直接使用范围索引进行匹配,而不具备基于cts:search
的查询的某些功能,如语言词干,但速度最快。因此,例如,要处理您可能想要匹配&#34; name&#34;的所有情况,您可能必须构建更详细的查询集:
cts:element-value-match(xs:QName('question'), ("* name?", "name *", "* name *"))
如果通配符的限制不会给您的应用程序带来任何问题,那么鉴于您的文档结构,这是查询这些值的最有效方法。
仍然使用cts:queries
并且可能足够快的一个折衷解决方案是在查询后过滤值:
for $v in cts:element-values(xs:QName('question'), (), (),
cts:element-word-query(xs:QName('question'), 'name'))
where cts:contains($v, cts:word-query('name'))
return $v
答案 1 :(得分:2)
您是否考虑将每个 [root@rdo1 network-scripts]# ifconfig
eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::29c:2ff:fea1:35a4 prefixlen 64 scopeid 0x20<link>
ether 00:9c:02:a1:35:a4 txqueuelen 1000 (Ethernet)
RX packets 164 bytes 17921 (17.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 29 bytes 2424 (2.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth2.43: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.13.43.24 netmask 255.255.255.0 broadcast 10.13.43.255
inet6 fe80::29c:2ff:fea1:35a4 prefixlen 64 scopeid 0x20<link>
ether 00:9c:02:a1:35:a4 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9 bytes 690 (690.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth2.44: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.13.44.24 netmask 255.255.255.0 broadcast 10.13.44.255
inet6 fe80::29c:2ff:fea1:35a4 prefixlen 64 scopeid 0x20<link>
ether 00:9c:02:a1:35:a4 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12 bytes 816 (816.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
保存在单独的文件中?这样你就不需要过滤了,你可以不用改变代码。
HTH!