Marklogic - 对地图进行排序
Marklogic - Sorting a Map
我正在尝试计算执行搜索的特定字段中最常用的字词。然后我尝试对 Map 进行排序,但在 order by 方面没有取得任何成功,也没有找到任何可行的功能。
任何人都可以建议或指出详细说明如何正确排序地图的文档吗?
这是一张示例地图
<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="Orlando">
<map:value xsi:type="xs:integer">2</map:value>
</map:entry>
<map:entry key="Christiantiy">
<map:value xsi:type="xs:integer">3</map:value>
</map:entry>
<map:entry key="Fort Lauderdale">
<map:value xsi:type="xs:integer">2</map:value>
</map:entry>
<map:entry key="Key West">
<map:value xsi:type="xs:integer">3</map:value>
</map:entry>
<map:entry key="David Robinson">
<map:value xsi:type="xs:integer">2</map:value>
</map:entry>
<map:entry key="Florida">
<map:value xsi:type="xs:integer">8</map:value>
</map:entry>
<map:entry key="test">
<map:value xsi:type="xs:integer">2</map:value>
</map:entry>
</map:map>
现在我正在尝试第二次循环遍历地图(删除计数为 1 的所有内容),并尝试向其添加订单,但没有成功。
let $_ :=
for $tag in map:keys($temp)
order by map:get($temp, $tag)
return
if (map:get($temp, $tag) = 1) then
()
else
let $_ := map:put($temp2, $tag, map:get($temp,$tag))
return $_
return $temp2
我想通了。
这是我的解决方案。
我没有进行搜索并尝试手动计算记录,而是使用 cts:values
,按频率排序。我用 key:values 制作了单独的地图,这样它们在添加到更大的地图时不会丢失顺序。
然后将这些单独的地图添加到一个集合中,该集合可以转换为 JSON。
let $current_epoch := xs:int(fn:substring(fn:string(xdmp:wallclock-to-timestamp(fn:current-dateTime())),0,11))
let $temp := map:map()
let $test := (
for $tag in cts:values(cts:element-reference(xs:QName('value')),(),"frequency-order",cts:and-query((
cts:json-property-range-query('creationdate', '<=', $current_epoch),
cts:json-property-range-query('creationdate', '>=', $current_epoch - 172800)
)))
let $map := map:map()
let $_ := map:put($map, $tag, cts:frequency($tag))
return xdmp:to-json($map)
)
我正在尝试计算执行搜索的特定字段中最常用的字词。然后我尝试对 Map 进行排序,但在 order by 方面没有取得任何成功,也没有找到任何可行的功能。
任何人都可以建议或指出详细说明如何正确排序地图的文档吗?
这是一张示例地图
<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="Orlando">
<map:value xsi:type="xs:integer">2</map:value>
</map:entry>
<map:entry key="Christiantiy">
<map:value xsi:type="xs:integer">3</map:value>
</map:entry>
<map:entry key="Fort Lauderdale">
<map:value xsi:type="xs:integer">2</map:value>
</map:entry>
<map:entry key="Key West">
<map:value xsi:type="xs:integer">3</map:value>
</map:entry>
<map:entry key="David Robinson">
<map:value xsi:type="xs:integer">2</map:value>
</map:entry>
<map:entry key="Florida">
<map:value xsi:type="xs:integer">8</map:value>
</map:entry>
<map:entry key="test">
<map:value xsi:type="xs:integer">2</map:value>
</map:entry>
</map:map>
现在我正在尝试第二次循环遍历地图(删除计数为 1 的所有内容),并尝试向其添加订单,但没有成功。
let $_ :=
for $tag in map:keys($temp)
order by map:get($temp, $tag)
return
if (map:get($temp, $tag) = 1) then
()
else
let $_ := map:put($temp2, $tag, map:get($temp,$tag))
return $_
return $temp2
我想通了。
这是我的解决方案。
我没有进行搜索并尝试手动计算记录,而是使用 cts:values
,按频率排序。我用 key:values 制作了单独的地图,这样它们在添加到更大的地图时不会丢失顺序。
然后将这些单独的地图添加到一个集合中,该集合可以转换为 JSON。
let $current_epoch := xs:int(fn:substring(fn:string(xdmp:wallclock-to-timestamp(fn:current-dateTime())),0,11))
let $temp := map:map()
let $test := (
for $tag in cts:values(cts:element-reference(xs:QName('value')),(),"frequency-order",cts:and-query((
cts:json-property-range-query('creationdate', '<=', $current_epoch),
cts:json-property-range-query('creationdate', '>=', $current_epoch - 172800)
)))
let $map := map:map()
let $_ := map:put($map, $tag, cts:frequency($tag))
return xdmp:to-json($map)
)