代码之家  ›  专栏  ›  技术社区  ›  Busturdust

Marklogic-对地图排序

  •  2
  • Busturdust  · 技术社区  · 9 年前

    我试图从执行的搜索的特定字段中计算最常用的术语。然后我尝试对地图进行排序,但在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的所有内容),并尝试向其添加一个order by,但运气不好。

    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
    
    1 回复  |  直到 9 年前
        1
  •  2
  •   Mads Hansen    9 年前

    我想出来了。

    我没有进行搜索并尝试手动统计记录,而是使用 cts:values ,按频率排序。我使用键:值制作单个地图,这样当添加到更大的地图时,它们不会失去顺序。

    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)
    )