我想使用MarkLogic的运行以下查询,但似乎找不到正确的方法。查询如下:
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实现了以下查询,但需要知道如何使用Client实现相同的查询。
根据讨论,我形成了以下查询,但是它仍然没有返回任何结果,如果有什么问题请告诉我。
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>发布于 2015-08-28 13:41:00
安基塔:
使用Java API,
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>http://docs.marklogic.com/javadoc/client/com/marklogic/client/admin/QueryOptionsManager.html#writeOptions%28java.lang.String,%20com.marklogic.client.io.marker.QueryOptionsWriteHandle%29
然后,为range约束构造一个字符串查询,用string查询创建一个值定义,并对该值定义执行一个值查询--如下所示:
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
希望这有帮助,
https://stackoverflow.com/questions/32268840
复制相似问题