2017-02-17 19 views
1

Я использую 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 или что я делаю неправильно в развертывании?


enter image description here

ответ

1

Если вы решили придерживаться пользовательского snippeter:

Похоже, Рокси пытается лечить это ваш модуль snippeter как расширение ресурсов, что это не так. Ваш snippeter должен быть просто ванильным модулем в модулях db.

IDK, как настроить Roxy, к сожалению, но для чего вам нужно установить Roxy, чтобы установить его с помощью PUT /v1/ext/directories/asset или прямой вставки (`PUT/v1/documents) на ваши модули db. См. http://docs.marklogic.com/REST/PUT/v1/ext/[directories]/[asset].

Предполагая, что Roxy использует/ext, путь к вашему snippeter НЕ будет безусловным путем, который у вас есть в ваших вариантах. Это был бы абсолютный путь, основанный на/ext /. См. http://docs.marklogic.com/guide/rest-dev/search#id_72390.

+2

Ради полноты, Ким прав. Если вы поместите xqy в папку rest-api/ext /, Roxy предполагает, что это расширение REST. Я бы рекомендовал поместить его в 'test-app/src/search/show-search-snipper.xqy', а затем изменить атрибут' at' в файле параметров на 'at ="/search/show-search-snipper .xqy "' .. – grtjn

0

Там более простой способ - вы можете сделать это с помощью опции extract-document-data поиска.

настроить некоторые выборочные данные для работы с так:

xquery version "1.0-ml"; 

for $i in (1 to 10) 
return 
    xdmp:document-insert(
    '/test-content-' || $i || '.json', 
    xdmp:unquote('{ "important": { "foo": 1, "bar": 2 }, "not-important": { "stuff": 3, "blah": 4 } }') 
) 

После бутстраповских и развернутые модули, я могу получить результаты поиска по http://localhost:8040/v1/search. Однако я могу начать больше контролировать результаты поиска, используя хранимые параметры поиска. Взгляните в свой проект на rest-api/config/options/all.xml. Они были развернуты для вас, когда вы запускаете ml local deploy modules, поэтому теперь вы можете искать с помощью http://localhost:8040/v1/search?options=all. Поскольку вы используете данные JSON, я сделал еще один шаг и побежал с: http://localhost:8040/v1/search?format=json&options=all.

Я добавил это rest-api/config/options/all.xml:

<extract-document-data selected="include"> 
    <extract-path>/important</extract-path> 
</extract-document-data> 

Это говорит о возможности поиска, чтобы включить указанный путь со всеми результатами поиска. После развертывания и повторного запуска процедуры поиска, один результат выглядит следующим образом:

{ 
    "index":1, 
    "uri":"/test-content-6.json", 
    "path":"fn:doc(\"/test-content-6.json\")", 
    "score":0, 
    "confidence":0, 
    "fitness":0, 
    "href":"/v1/documents?uri=%2Ftest-content-6.json", 
    "mimetype":"application/json", 
    "format":"json", 
    "matches":[{"path":"fn:doc(\"/test-content-6.json\")/object-node()", "match-text":[]}], 
    "extracted":{ 
    "kind":"array", 
    "content":[ 
     {"important":{"foo":1, "bar":2}} 
    ] 
    } 
}, 

Обратите внимание на «извлеченный» часть в конце концов там - я получаю «важный» свойство JSON, как указано в настройках.

Полный список параметров, которые вы можете установить для управления поиском, см. В разделе Query Options Reference appendix.

+0

Привет, Дейв, я действительно пробовал что-то подобное, но проблема у меня в том, что эквивалент вашего «важного» на самом деле является массивом, и когда я пытаюсь это сделать, он возвращает каждый объект в массиве, а не только который имел матч. Я добавил изображение, которое показывает 1 совпадение, и несколько сегментов возвращаются в OP – Busturdust

+0

в порядке, поэтому «важный» должен быть массивом объектов, и вы хотите вытащить только соответствующий объект из этого массива. Например, если массив имеет несколько объектов типа {"source": "whatever", "content": «So long and thanks for all the fish»}, а поисковый термин - «рыба», вы хотите получить этот объект и вернуть его. Верный? –

+0

Да, это правильно – Busturdust

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