【问题标题】:Marklogic index troubleMarklogic 索引问题
【发布时间】:2014-04-07 15:54:54
【问题描述】:

我在正确设置索引时遇到了一些问题。 我正在尝试查询具有很多“地图”属性的(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 关系。我需要在我的“聚合”函数上获得良好的性能,该函数可以找到一起构成“wijk”对象的所有 ppc6 对象。通常有大约 500.000 个 ppc6 对象和 40.000 个“wijk”对象。

我已经在地图元素上为这个文档创建了一个片段根。

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

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 power...所以我们需要索引...

查询给了我一个错误,例如:

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"), "*")

index not found: string element-attribute range index for ... 不知道下一步该去哪里?

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

【问题讨论】:

    标签: xpath indexing marklogic


    【解决方案1】:

    雨果:

    MarkLogic 的一些最佳实践是:

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

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

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

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

    希望对您有所帮助,

    埃里克·亨纳姆

    【讨论】:

    • 嗨,埃里克,谢谢你的想法,这正是我试图解决这个问题的方式。但不是我主要问题的答案。雨果
    【解决方案2】:

    您应该拆分 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 选项。这可能正是您所需要的。

    【讨论】:

    • 在这种情况下,引号把我烧死了……确实,我的问题是命名空间问题。我在控制台的定义中添加了引号。在您的回答中也正确,属性没有命名空间,因此我们可以将其留空。我不需要地图上的元素范围索引。片段根也不喜欢引号。元素/父元素确实需要一个命名空间,所以我现在的查询是 cts:element-attribute-values(xs:QName("op:map"),xs:QName("wijk_id"),"") ,非常快。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多