Я использую Roxy для управления моим проектом. Кроме того, используя MarkLogic 8.0-6.1MarkLogic - Пользовательский поиск Snippet
Я пытаюсь представить SEARCHTERM и возвращать пользовательские отформатированные search:snippet
Вот полные шаги, которые я беру:
./../roxy/ml new test-app --server-version=8 --app-type=rest
Настройка моей сборки .properties
cd test-app/
./ml local bootstrap
Теперь у меня есть проект.
Создать файл - тест-приложение/отдых-апи/Ext/шоу-search.xqy
xquery version "1.0-ml";
module namespace ss = "http://marklogic.com/rest-api/resource/show-search";
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";
import module namespace json = "http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";
declare
function ss:get(
$context as map:map,
$params as map:map
) as document-node()*
{
map:put($context, "output-types", "application/json"),
map:put($context, "output-status", (200, "OK")),
let $search-term := map:get($params, "searchTerm")
let $query := search:search($search-term,
<options xmlns="http://marklogic.com/appservices/search">
<transform-results apply="raw"/>
</options>
)
return document {$query}
};
(:
:)
declare
function ss:put(
$context as map:map,
$params as map:map,
$input as document-node()*
) as document-node()?
{
map:put($context, "output-types", "application/xml"),
map:put($context, "output-status", (201, "Created")),
document { "PUT called on the ext service extension" }
};
(:
:)
declare
function ss:post(
$context as map:map,
$params as map:map,
$input as document-node()*
) as document-node()*
{
map:put($context, "output-types", "application/xml"),
map:put($context, "output-status", (201, "Created")),
document { "POST called on the ext service extension" }
};
(:
:)
declare
function ss:delete(
$context as map:map,
$params as map:map
) as document-node()?
{
map:put($context, "output-types", "application/xml"),
map:put($context, "output-status", (200, "OK")),
document { "DELETE called on the ext service extension" }
};
запрос выше GET используется параметр transform-results apply=raw
, разворачивает и функционирует должным образом (у меня есть несколько тестовых документов) ,
Однако я не хочу, чтобы вернуть весь документ, я хочу, чтобы вернуть целый раздел JSON, который имел матч, независимо от того, где в том, что seciton матч произошло (нижние уровни)
Так я стараюсь написать мой собственный snipper
Создать файл - тест-приложение/отдых-апи/внутр/шоу-поиск-snipper.xqy
xquery version "1.0-ml";
module namespace sss = "http://marklogic.com/rest-api/resource/show-search-snipper";
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";
import module namespace json = "http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";
declare
function sss:my-snippet(
$result as node(),
$ctsquery as schema-element(cts:query),
$options as element(search:transform-results)?
) as element(search:snippet)
{
<search:snippet>
</search:snippet>
};
Я затем обновить search:search
вызов к следующему
let $query := search:search($search-term,
<options xmlns="http://marklogic.com/appservices/search">
<transform-results apply="my-snippet" ns="http://marklogic.com/rest-api/resource/show-search-snipper" at="show-search-snipper.xqy"/>
</options>
)
Теперь я должен иметь все, что нужно (я думаю)
Я бегу развернуть ./ml local deploy rest
и получить следующую
Minty-linux test-app # ./ml local deploy rest Loading REST properties in /opt/this-is-a-test/test-app/rest-api/config/properties.xml Loading REST options in /opt/this-is-a-test/test-app/rest-api/config/options
Loading REST extensions from /opt/this-is-a-test/test-app/rest-api/ext
ERROR: 400 "Bad Request" ERROR: {"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"RESTAPI-INVALIDCONTENT", "message":"RESTAPI-INVALIDCONTENT: (err:FOER0000) Invalid content: invalid show-search-snipper extension: show-search-snipper either is not a valid module or does not provide extension functions (delete, get, put, post) in the http://marklogic.com/rest-api/resource/show-search-snipper namespace"}}
Так что я попытался переместить файл show-search-snipper.xqy
до 1 уровня (в test-app/rest-api/show-search-snipper.xqy`
Запуск развертывания D eployment Работа Нет ошибок Хита URL и получить следующую
500 Internal Server Error INTERNAL ERROR RESTAPI-INVALIDREQ: (err:FOER0000) Invalid request: reason: Extension show-search does not exist. . See the MarkLogic server error log for further detail.
Хотя я знаю, что расширение было создано должным образом, так как он работал отлично до введения пользовательской функции надреза. (with apply = "raw")
Любые мысли о том, как я могу применить свою пользовательскую функцию snip или что я делаю неправильно в развертывании?
Ради полноты, Ким прав. Если вы поместите xqy в папку rest-api/ext /, Roxy предполагает, что это расширение REST. Я бы рекомендовал поместить его в 'test-app/src/search/show-search-snipper.xqy', а затем изменить атрибут' at' в файле параметров на 'at ="/search/show-search-snipper .xqy "' .. – grtjn