Marklogic索引有问题

时间:2014-04-07 15:54:55

标签: xpath indexing marklogic

我有一些问题让我的索引正确。 我试图查询具有很多“地图”属性的(大80Mb)文档,如

<oplage version="0.2" xmlns="http://www.nvsp.nl/oplage-mapping">
<meta-data>
<!--Generated by DIKW for NetwerkVSP STTip-->
<dateCreated>2014-04-03 13:23:16.885124</dateCreated>
</meta-data>
<map ppc6_id="1001WE" wijk_id="">
   <bruto>0</bruto>
   <stickers>0</stickers>
   <netto>0</netto>
</map>

问题1实际上是:我需要拆分这个文件吗?它的大小为80MB,我需要增加内存列表大小。我在某处读到,在内存中有大量文档通常不是一个好主意。该文档在两种类型的对象“ppc6”对象和“wijk”对象之间保持n:m关系。我需要在我的'聚合'函数上获得良好的性能,找到所有ppc6对象,它们共同构成一个'wijk'对象。通常,大约有500,000个ppc6对象和40.000个“wijk”对象。

我在地图元素上为此文档制作了一个fragement root。

地图元素上的元素范围索引。

ppc6_id和wijk_id的属性范围索引,如

scalartype is string
parent namespace uri : "http://www.nvsp.nl/oplage-mapping"
parent local name : map
namespace uri equal to parent namespace (can this ever be *not* the same???)
localname :  wijk_id,ppc6_id (not sure how to add more then one here?)

我的查询如下:

xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
declare namespace op = "http://www.nvsp.nl/oplage-mapping";

let $d := '/data/map/oplage-mapping.xml'
let $ids := fn:doc($d)//op:map/@wijk_id
let $u := fn:distinct-values($ids)
let $id2 := cts:element-attribute-values(xs:QName("map"),
                           xs:QName("wijk_id"),
                           "*")

return (fn:count($ids),fn:count($u))

我们首先沿着xpath路线走下去但是这不起作用,我们需要cts电源......所以我们需要索引......

查询给出了如下错误:

XDMP-ELEMATTRRIDXNOTFOUND: cts:element-attribute-values(fn:QName("", "map"), fn:QName("", "wijk_id"), "*") -- No string element-attribute range index for fn:QName("", "map") fn:QName("", "wijk_id") http://marklogic.com/collation/
on line 8
expr: cts:element-attribute-values(fn:QName("", "map"), fn:QName("", "wijk_id"), "*")

索引未找到:字符串元素属性范围索引... 不知道下一步去哪儿了?

我找不到关于设置特定范围索引的那么多文档/工作示例......

2 个答案:

答案 0 :(得分:3)

雨果:

MarkLogic的一些最佳做法是:

  • 将文档视为关系行的等效项,而不是关系表的等效项。
  • 在可能的情况下进行非规范化,而不是根据请求进行聚合。

从上面的描述中,我想知道是否可以将每个wijk对象存储在单独的文档中,并在wijk文档中存储wijk对象的ppc6对象。

如果这不可行,另一种方法是将每个wijk和ppc6对象存储在自己的文档中,在ppc6文档中为wijk的外键放置范围索引,并通过

进行聚合
  1. 查询wijk对象
  2. 将wijk对象放入地图
  3. 将wijk对象的主键提取为值序列
  4. 使用主键序列作为ppc6文档中外键的范围查询的值列表。
  5. 希望有帮助,

    Erik Hennum

答案 1 :(得分:0)

你应该拆分80 MB文件吗?应该是。如上所述,MarkLogic希望文档像行一样行动,而不是表格。另一种设计是创建一个map:map项并将其存储为文档,但这是一种不寻常的方法,我不确定它是否真的合适。例如,每个查询加载地图会有明显的额外延迟。

您的范围索引有什么问题?命名空间。您的属性位于空命名空间中,而不是父元素命名空间。默认元素名称空间声明(xmlns="...")不适用于属性。

同样,当您调用cts:element-attribute-values时,您需要为父QName提供正确的命名空间。并删除'*'参数:那是cts:element-attribute-value-match,它将通配符与词典进行匹配。如果您想要所有值,则使用空序列调用cts:element-attribute-value会更有效。

最后,查看http://docs.marklogic.com/cts:value-co-occurrences及其map选项。这可能正是你所需要的。