Marklogic REST API поиск последней версии документа

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

Используя прямой xquery, вы можете использовать dls:documents-query() в качестве параметра дополнительного запроса (см. Есть ли способ ограничить поиск marklogic для определенной версии документа).

Но 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, если это возможно.


person paloma    schedule 09.01.2014    source источник


Ответы (2)


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

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!

person grtjn    schedule 09.01.2014
comment
Ах, это работает. Мы бы предпочли не дублировать существующие конечные точки, если в этом нет необходимости. Спасибо! - person paloma; 10.01.2014

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

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

person mblakele    schedule 09.01.2014