2014-01-09 5 views
3

Нам нужно ограничить поиск MarkLogic самой последней версией управляемых документов, используя REST apache Marklogic. Мы используем MarkLogic 6.Marklogic REST API ищет последнюю версию документа

Использование прямого XQuery, вы можете использовать dls:documents-query() в качестве опции дополнительного-запроса (см Is there any way to restrict marklogic search on specific version of the document).

Но для REST api требуется XML, а не произвольный xquery. Вы можете легко превратить обычные запросы cts в XML (выполнить <some-element>{cts:word-query("hello world")}</some-element> в QConsole).

Если я пытаюсь что с dls:documents-query() я получаю это:

<cts:properties-query xmlns:cts="http://marklogic.com/cts"> 
    <cts:registered-query> 
     <cts:id>17524193535823153377</cts:id> 
    </cts:registered-query> 
</cts:properties-query> 

Помимо того, что меньше, чем полностью прозрачны ... насколько безопасно это число? Нам нужно поместить его в наши параметры запроса, поэтому мы не можем регенерировать каждый раз, когда нам это нужно. Я посмотрел на две разные установки здесь, и номер тот же, но гарантированно ли он тот же, и будет ли он когда-либо изменяться? Например, обновление MarkLogic?

Кроме того, при условии, что номер является безопасным, будет ли всегда зарегистрирован запрос? В документации указано, что зарегистрированные запросы могут быть очищены системой в разное время, но речь идет о пользовательских зарегистрированных запросах, и я не уверен, насколько это относится к внутренним запросам.

Это даже правильный подход? Если мы не сможем сделать это, мы всегда можем создавать коллекции и ограничивать поиск таким образом, но мы бы предпочли использовать dls:documents-query, если это возможно.

ответ

1

Звонок в dls:documents-query() гарантирует, что запрос фактически зарегистрирован (на лету, если необходимо), но это не будет работать с REST api. Вы можете расширить API REST с помощью пользовательского расширения, как предложил Майк, но вы также можете использовать следующие:

cts:properties-query(
    cts:and-not-query(
    cts:element-value-query(
     xs:QName("dls:latest"), 
     "true", 
    (), 
     0 
    ), 
    cts:element-query(
     xs:QName("dls:version-id"), 
     cts:and-query(()) 
    ) 
) 
) 

То есть запрос, который зарегистрирован dls:documents-query(). Могут не быть будущие доказательства, хотя, поэтому проверяйте при каждом обновлении. Вы можете найти определение функции в /Modules/MarkLogic/dls.xqy

HTH!

+0

А, это работает. Мы бы предпочли не дублировать существующие конечные точки, если нам это не нужно, на данный момент. Благодаря! – paloma

2

Число является зарегистрированным идентификатором запроса и является детерминированным. То есть, он будет таким же каждый раз, когда запрос будет зарегистрирован. Это поведение было неизменным в нескольких основных выпусках, но не гарантировано. И, как вы уже знаете, сервер может отменить регистрацию запроса в любое время. Если это произойдет, любой запрос с использованием этого идентификатора вызовет ошибку XDMP-UNREGISTERED. Поэтому лучше всего регенерировать запрос, когда вам это нужно, возможно, снова позвонив по телефону dls:documents-query. Это безопаснее сделать это в с таким же запросом в качестве последующего поиска.

Поэтому я предлагаю расширить API REST с помощью собственной версии конечной точки поиска. Ваша новая конечная точка может добавить dls:documents-query к входному запросу. Таким образом, зарегистрированный запрос будет сгенерирован в том же запросе с последующим поиском. Для ML6 http://docs.marklogic.com/6.0/guide/rest-dev/extensions объясняет, как это сделать.

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