MarkLogic - 获得不同的价值观

时间:2017-01-24 00:58:27

标签: marklogic

我有一个包含大致相同的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;在问题文本中。例如在上面的示例中,返回了两个问题。我认为这是因为我正在使用的查询未经过滤传递,因此如果该片段存在匹配,它将从片段返回任何问题。

这个假设是否正确?

我能做些什么才能有效地实现我想做的事?

谢谢!

2 个答案:

答案 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!