MarkLogic 中聚合函数的使用

Usage of aggregate functions in MarkLogic

我有一个这样的XML。

<?xml version="1.0" encoding="UTF-8"?>
<doc>
  <ticker> CSGN.VX </ticker>
  <stockExchange> NYSE </stockExchange>
  <stockDatas>
    <stockData>
      <date>2015-08-06</date>
      <closingPrice>140</closingPrice>
    </stockData>
    <stockData>
      <date>2015-08-07</date>
      <closingPrice>140.25</closingPrice>
    </stockData>
    <stockData>
      <date>2015-08-10</date>
      <closingPrice>140.75</closingPrice>
    </stockData>
  </stockDatas>
</doc>

我将在不同年份为不同公司提供类似的 XML。现在我想搜索在特定时间段内代码为 CSGN.VX 的文档,因此我使用此查询。

xquery version "1.0-ml";
import module namespace search =  "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";

search:search(
  'ticker:CSGN.VX AND (dateRange GE "2015-08-07" AND dateRange LE "2015-08-21")', 
  <options xmlns="http://marklogic.com/appservices/search">
    <constraint name="dateRange">
      <range type="xs:date" facet="false">
        <element ns="" name="date"/>
      </range>
    </constraint>
    <constraint name="ticker">
      <range type="xs:string" >
        <element ns="" name="ticker"/>
      </range>
    </constraint>
  </options>)

有没有一种方法可以在进行文档搜索的同时,获得特定时间段内的收盘价平均值?

我刚得到一个解决方案,但我有一个进一步的查询,我正在寻找一种使用 Marklogic 的 java 客户端 API 来实现它的方法,所以有没有一种方法可以实现 search:parse 和 search:values 使用 Java 客户端 API

我知道一种实现方法是通过 MarklogicXCC API,但我想知道是否有一种方法可以 运行 使用客户端 API

如果您有收盘价的范围索引,您应该可以这样做:

xquery version "1.0-ml";

import module namespace search =  "http://marklogic.com/appservices/search"at "/MarkLogic/appservices/search/search.xqy";

let $query :=
  search:parse(
    'ticker:CSGN.VX AND (dateRange GE "2015-08-07" AND dateRange LE "2015-08-21")',

    <options xmlns="http://marklogic.com/appservices/search">
      <constraint name="dateRange">
        <range type="xs:date" facet="false">
           <element ns="" name="date"/>
        </range>
      </constraint>
      <constraint name="ticker">
        <range type="xs:string" >
           <element ns="" name="ticker"/>
        </range>
      </constraint>
    </options>,

    "search:query"
  )

return
  search:values(
    'closingPrice', 

    <options xmlns="http://marklogic.com/appservices/search">
      <values name="closingPrice">
        <range type="xs:double">
           <element ns="" name="closingPrice"/>
        </range>
        <aggregate apply="avg"/>
      </values>
    </options>,

    $query
  )

注意:我确实建议单独存储每个 stockData,否则 dateRange 过滤器可能无法按预期工作。

HTH!