2015-08-28 137 views
0

工作我想用MarkLogic的Java客戶端API來運行下面的查詢,但似乎無法找到正確的道路。 查詢如下:與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> 
+0

爲了澄清,我是不是就在猜你指的是Java客戶端API? (我假設是這樣的,因爲你從XCC開始,但請確認。) –

+0

是的@DaveCassel我正在嘗試Java客戶端API。 –

回答

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

希望幫助,

+0

由於我是新來Marklogic我從來沒有嘗試過的價值搜尋但是我想你說什麼,我沒有它不斷給我 REST-INVALIDPARAM:(ERR:FOER0000)無效的參數:沒有配置的選項:<選擇的xmlns =」 http://marklogic.com/appservices/search"><範圍類型= 「XS:雙」><元素NS = 「」 名稱= 「closingPrice」/><骨料申請=」平均「/> 這將是非常有益的,如果你能給我與我的查詢的例子。 –

+0

喜@ehennum確實做到了由您指定,但似乎仍然沒有也返回結果我設置的QueryDef標準股票代碼:CSGN.VX AND(GE DATERANGE \「2015年8月7日\」和DATERANGE LE \」 2015-08-21 \「) 而且我還設置valuesDef.setAggregated爲」平均「以獲得平均值,但它仍然不會返回任何結果。 –

+0

在發佈之前,我在回答中測試了代碼;但是,我沒有發現你的代碼中有任何問題。您可以嘗試開始簡單並逐步增強到要執行的完整查詢以嘗試隔離問題。例如:1)從Java API執行字符串查詢而不使用任何約束。 2)在沒有任何字符串查詢的情況下從Java API執行值查詢。 3)將字符串查詢添加到值查詢中。 4)繼續加強約束和總量。希望有幫助。 – ehennum