【问题标题】:Working with MarkLogic Java Client API使用 MarkLogic Java 客户端 API
【发布时间】:2015-08-28 10:26:20
【问题描述】:

我想使用 MarkLogic 的 Java 客户端 API 运行以下查询,但似乎找不到正确的方法。 查询如下:

xquery version "1.0-ml";

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

declare variable $searchQuery as xs:string external ;
declare variable $aggregateFunc as xs:string external ;

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

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

let $r :=
  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
  )

return <result>{$r}</result>

我已经使用 MarkLogic XCC 实现了以下查询,但需要知道如何使用客户端 API 来实现。

根据讨论,我形成了以下查询,但是它仍然没有返回任何结果,如果有问题请告诉我。

QueryManager queryMgr = client.newQueryManager();

ServerConfigurationManager configManager = client.newServerConfigManager();
configManager.newNamespacesManager();
QueryOptionsManager optionsMgr = configManager.newQueryOptionsManager();

optionsMgr.writeOptions(VALUE_OPTION, new StringHandle(VALUE_OPTIONS));
StringQueryDefinition qd = queryMgr.newStringDefinition(VALUE_OPTION);
qd.setCriteria("ticker:CSGN.VX AND (dateRange GE \"2015-08-07\" AND dateRange LE \"2015-08-21\")");

ValuesDefinition vdef = 
    queryMgr.newValuesDefinition("closingPrice", VALUE_OPTION);


vdef.setQueryDefinition(qd);

vdef.setAggregate("avg");

ValuesHandle results = queryMgr.values(vdef, new ValuesHandle());
StringHandle strResults=queryMgr.values(vdef, new StringHandle());

值选项在哪里:

  <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>
<values name="closingPrice">
  <range type="xs:double">
    <element ns="" name="closingPrice"/>
  </range>
</values>
</options>

【问题讨论】:

  • 澄清一下,我猜你指的是 Java 客户端 API 是否正确? (我假设是这样,因为您是从 XCC 开始的,但请确认。)
  • 是的 @DaveCassel 我指的是 Java 客户端 API。

标签: marklogic


【解决方案1】:

安基塔:

使用 Java API,

http://docs.marklogic.com/guide/java/searches#id_83836

首先持久化定义范围约束和值定义的查询选项:

<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>
<values name="closingPrice">
  <range type="xs:double">
     <element ns="" name="closingPrice"/>
  </range>
</values>
</options>

https://github.com/marklogic/java-client-api/blob/master/src/main/java/com/marklogic/client/example/cookbook/StringSearch.java#L73-L91

http://docs.marklogic.com/javadoc/client/com/marklogic/client/admin/QueryOptionsManager.html#writeOptions%28java.lang.String,%20com.marklogic.client.io.marker.QueryOptionsWriteHandle%29

然后,为范围约束构造一个字符串查询,一个带有字符串查询的值定义,并对值定义执行一个值查询——如下所示:

QueryManager queryMgr = client.newQueryManager();

StringQueryDefinition querydef = queryMgr.newStringDefinition(
    OPTIONS_NAME);
querydef.setCriteria(QUERY_TEXT);

ValuesDefinition valuesdef = queryMgr.newValuesDefinition(
    "closingPrice", OPTIONS_NAME);
valuesdef.setQueryDefinition(querydef);

// or any other handle
StringHandle readHandle =
    queryMgr.values(valuesdef, new StringHandle());

http://docs.marklogic.com/javadoc/client/com/marklogic/client/query/QueryManager.html#newStringDefinition%28java.lang.String%29

http://docs.marklogic.com/javadoc/client/com/marklogic/client/query/QueryManager.html#newValuesDefinition%28java.lang.String,%20java.lang.String%29

http://docs.marklogic.com/javadoc/client/com/marklogic/client/query/ValuesDefinition.html#setQueryDefinition%28com.marklogic.client.query.ValueQueryDefinition%29

http://docs.marklogic.com/javadoc/client/com/marklogic/client/query/QueryManager.html#values%28com.marklogic.client.query.ValuesDefinition,%20T%29

希望对您有所帮助,

【讨论】:

  • 因为我是 Marklogic 的新手,所以我从未尝试过值搜索,但是我尝试了您所说的但失败了,它一直给我 REST-INVALIDPARAM:(错误:FOER0000)无效参数:没有配置选项: marklogic.com/appservices/search"><values name="closingPrice"> 如果您能给我一个与我的查询相关的示例,那将非常有帮助。
  • 嗨@ehennum 完全按照您的指定进行,但似乎仍然没有返回结果,我还将querydef 标准设置为ticker:CSGN.VX AND (dateRange GE \"2015-08-07 \" AND dateRange LE \"2015-08-21\") 并且我将 valuesDef.setAggregated 设置为 "avg" 以获得平均值,但它仍然没有返回任何结果。
  • 我在发布之前确实测试了答案中的代码;但是,我没有在您的代码中发现任何问题。您可以尝试从简单的增量增强到要执行的完整查询,以尝试隔离问题。例如: 1) 从 Java API 执行字符串查询而不使用任何约束。 2) 从 Java API 执行值查询,无需任何字符串查询。 3)将字符串查询添加到值查询。 4)继续增强约束和聚合。希望对您有所帮助。
猜你喜欢
  • 2018-10-07
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多