【问题标题】:Return unique element values from large database从大型数据库返回唯一元素值
【发布时间】:2015-03-14 21:25:49
【问题描述】:

我有一个大型 ML 数据库设置(大约 40,000 个)不同的 XML 文件,需要从所有文件中获取唯一关键字元素的列表,其中每个文件有多个。

我使用了几个查询,每个都返回一个不同的问题

for $doc in (cts:search(fn:collection(), cts:element-query(xs:QName("kwd"),())))
return fn:distinct-values($doc/article/.../kwd/string())

扩展树缓存已满

for $doc in fn:distinct-values(cts:search(/article/.../kwd, cts:element-query(xs:QName(()),())))
return $doc

这将返回一个唯一结果列表,但需要一个永恒的时间来加载并在输出前加上“xs:UntypedAtomic(...”。在返回查询中使用 string() 表示“这不是一个节点”

我怎样才能让它工作?

【问题讨论】:

  • kwd 是否位于您在 range-index 设置中指定的名称空间之外?你能发布一个xml sn-p吗?
  • BTW cts:element-query(xs:QName("kwd"),()) 将返回空序列。你可能想要cts:element-query(xs:QName("kwd"), cts:and-query(()))

标签: xpath xquery marklogic nosql


【解决方案1】:

没有索引:

fn:distinct-values(collection()/article//kwd)

虽然此解决方案不能很好地扩展,而且可能很慢。我建议在元素 kwd 或路径 article//kwd 上添加范围索引。然后使用类似这样的方法来获取唯一值(来自元素范围索引):

cts:element-values(xs:QName('kwd'))

对于路径范围索引,您需要使用cts:values()。这些值词典在亚秒内给出响应,最高可达毫秒以下。

HTH!

【讨论】:

  • 我尝试向 kwd 添加范围索引,但找不到该元素,这似乎有点奇怪。我将范围索引添加到其中一个父元素以查看是否有效。然后我尝试运行 cts:element-values 查询并得到错误“fn:QName 没有元素范围索引...”。如何让所有元素都可用于索引?
  • 你说“它找不到元素”。你得到一个错误,或者当你调用 element-values() 时你没有得到任何结果?如果你要添加父元素,你需要一个路径范围索引,而不是元素范围索引,正如 grtjn 所说,您需要调用 cts:values() 而不是 cts:element-values()。
  • 错误XDMP-ELEMATTRRIDXNOTFOUND No element range index 并不意味着找不到该元素。相反,这意味着传递给cts:element-values 的规范与任何现有索引都不匹配。这可能是您这边的配置错误或代码错误或两者兼而有之。 stackoverflow.com/questions/10578706/… 的答案可能会有所帮助,或者查看 docs.marklogic.com/guide/admin/range_indexdeveloper.marklogic.com/blog/grokking-the-cts-api — 或发布一个包含详细信息的新问题。
猜你喜欢
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多