2017-02-15 18 views
2

Я очень недавно начал работу с MarkLogic и XQuery.MarkLogic - Расширение поиска, возврат определенного узла объекта

Я пытаюсь создать Search Transform вернуться, в фактический JSON от конкретного уровня документа

Вот пример документа.

enter image description here

Я хотел бы вернуть все JSON на основе segment независимо от того, где результаты поиска находятся на нижнем уровне (транскрипт, темы, баннеры и т.д.,)


плескаться в в запросе консоли ...

search:search('trump')/search:result/search:snippet//@path

успешно Возвращаетобъекта, завернутый в Fn: док

п: док ("/ 20170120/NBCNightlyNews/1830/НВК")/массив узлов ("сегменты")/объект-узел() 1/транскрипт/узел ("00:00:02")/текста ("сообщение")

Однако

Когда я пытаюсь implment подобного Xpath выражения в преобразовании.

let $root := $content/* 
return document {$root/search:result/search:snippet//@path} 

И попытаться выполнить его (в независимо от того, что выражение XPath является, кроме того, просто $ самого корня есть другая неудача) возвращает

<error-response xmlns="http://marklogic.com/xdmp/error"> 
<status-code>400</status-code> 
<status>Bad Request</status> 
<message-code>XDMP-CHILDNODEKIND</message-code> 
<message> 
XDMP-CHILDNODEKIND: $root/search:result/search:snippet/descendant-or-self::node()/@path -- document nodes cannot have attribute node children 
</message> 
</error-response> 

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

Любые мысли?

ответ

2

Похоже, вы написали a REST API service extension для выполнения поиска. Если это так, подумайте об использовании конечной точки /v1/search - таким образом вы используете встроенную функциональность.

Я не уверен, что вы пытаетесь сделать: хотите ли вы вернуть фрагменты из части «сегмента» документа или хотите вернуть эту часть документа независимо от того, где матчи были?

Если вы указали только те из них, которые вы хотите найти, то можете использовать customize the snippeting, указав предпочтительный источник совпадений.

Если последнее, вы можете написать a search transform, который даст вам полный контроль над тем, что возвращается.

Эти параметры доступны (и я думаю то же самое), независимо от того, используется ли REST API или вызывается API поиска.

+0

Привет, Дейв, благодарю вас за ответ.Раньше я использовал '/ v1/search', но в конечном итоге вам придется дополнительно настроить поиск (мы используем сервер анализа контента, который обеспечит весовые коэффициенты, которые нам нужно включить в поиск, поэтому я начал использовать расширение. Я считаю, что мне нужно немного исследовать Transforms, а затем вернуться к логике пользовательского поиска. Я вернусь назад после того, как прочитаю предлагаемые документы. – Busturdust

+1

В зависимости от вашей конечной цели вы также можете посмотреть на извлечение-документ- данных, который позволяет извлекать выбранные части сопоставленного документа. http://docs.marklogic.com/guide/search-dev/query-options#id_37692 – kcoleman

+1

Как подсказка Дейва и Кима, вы можете использовать API поиска в пределах расширение вашего ресурса, которое даст вам фрагментацию и извлечение на основе XPath. – ehennum

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