2015-08-28 2 views
0

Я хочу выполнить следующий запрос с помощью API-интерфейсов клиента MarkLogic, но не могу найти правильный путь. Запрос выглядит следующим образом:Работа с API-интерфейсом клиента MarkLogic Java

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 ХСС, но нужно знать, как реализовать такую ​​же с помощью Client 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

Чтобы уточнить, я верно угадали вы имеете в виду клиента API Java? (Я так полагаю, учитывая, что вы начали с XCC, но, пожалуйста, подтвердите.) –

+0

Да @DaveCassel Я возвращаюсь к API-интерфейсу Java. –

ответ

1

Ankita:

Использование API Java,

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) Неверный параметр: Нет настроенных параметров: <значения name = "closedPrice"> Было бы очень полезно, если бы вы могли привести пример, связанный с моим запросом. –

+0

Привет, @ehennum сделал именно то, что было указано вами, но, похоже, не возвращает результаты, также я задал критерии querydef для тикера: CSGN.VX AND (dateRange GE \ "2015-08-07 \" AND dateRange LE \ " 2015-08-21 \ ") , а также я установил valuesDef.setAggregated to" avg ", чтобы получить среднее значение, но оно все равно не возвращает никакого результата. –

+0

Я проверил код в своем ответе, прежде чем отправлять его; однако, я не обнаруживаю никаких проблем в коде. Вы можете попробовать начать простой и постепенно увеличивать полный запрос, который хотите выполнить, чтобы попытаться изолировать проблему.Например: 1) выполнить строковый запрос из Java API без каких-либо ограничений. 2) выполнить запрос значений из Java API без какого-либо строкового запроса. 3) добавьте строковый запрос в запрос значений. 4) продолжают улучшаться с ограничениями и агрегатами. Надеюсь, это поможет. – ehennum

Смежные вопросы