Marklogic 基于密钥通配符的地图搜索

Marklogic 基于密钥通配符的地图搜索,marklogic,Marklogic,我有以下地图: <map:map xmlns:map="http://marklogic.com/xdmp/map" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <map:entry key="101201"> <map:value> "content" </map:value> </map

我有以下地图:

<map:map xmlns:map="http://marklogic.com/xdmp/map" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<map:entry key="101201">
<map:value>
"content"
</map:value>
</map:entry>
... more maps ...

“内容”
... 更多地图。。。
现在,我想使用通配符根据键搜索/过滤地图

实际上,我想根据key=“101201”so key=“1012**”的前4个字符进行过滤

问题:请给我所有具有匹配“1012*”键的地图


这能有效地做到吗

谢谢你的时间


hugo

这里没有索引,这限制了你的技巧。这是可行的,但我不确定它在规模上的表现如何:

let $map-of-maps :=
  map:new((
    map:entry('10000', map:new((map:entry('key1', 'value1'), map:entry('key2', 'value2')))),
    map:entry('20000', map:new((map:entry('key3', 'value3'), map:entry('key4', 'value4'))))
  ))
let $keys := 
  for $key in map:keys($map-of-maps) 
  where fn:matches($key, '1000*') 
  return $key
return $keys

内存中没有映射(或节点)的索引。但是,您可以在数据库中持久化映射的XML序列化,然后使用索引解析查询。要保存映射XML,请执行以下操作:

let $map := map:new(( map:entry("test", "1, 2") ))
return xdmp:document-insert("/map.xml", document { $map })
您可以与通配符选项一起使用,无需其他配置:

cts:search(/map:map/map:entry,
  cts:element-attribute-value-query(
    xs:QName("map:entry"), xs:QName("key"), "1012*", ("wildcarded")))
或者,您可以创建元素属性范围索引,并使用:


这能有效地做到吗?对不会有任何I/O或网络流量,只有CPU

map:keys($map)[starts-with(., '1012')]

map:get($map, map:keys($map)[starts-with(., '1012')])
但是,如果这是一个常见的用例,那么您可能需要构建一个地图地图。一个映射将有四个数字键,每个条目将包含一个以相同前缀开头的六个数字键的映射。这样,您就可以通过一个
map:get
获得四位数的匹配,通过
substring
和两个调用
map:get
获得六位数的匹配

map:get($m, substring($id, 1, 4))

map:get(map:get($m, substring($id, 1, 4)), $id)
由您决定为哪个用例进行优化。

这是什么意义上的“地图地图”?我看到一张有一个条目的地图。我没有看到地图的地图。
map:get($m, substring($id, 1, 4))

map:get(map:get($m, substring($id, 1, 4)), $id)