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