2017-02-07 17 views
2

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

У меня есть образец XML Doc

<pdf2xml> 
    <page pageNo="1">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</page> 
    <page pageNo="2">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</page> 
    <page pageNo="3">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</page> 
    <page pageNo="4">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</page> 
</pdf2xml> 

Как я могу получить pageNo для данного результата поиска? Я попытался следующие

search:snippet(fn:doc($uri), 
    cts:query(search:parse($q, $options)), 
    <transform-results apply="snippet" xmlns="http://marklogic.com/appservices/search"> 
     <per-match-tokens>30</per-match-tokens> 
     <max-matches>1000</max-matches> 
     <max-snippet-chars>2000</max-snippet-chars> 
     <preferred-matches> 
     <element name="page" ns=""/> 
     </preferred-matches> 
    </transform-results>) 

Это не дает все фрагменты, а ... что это хороший способ делать то, что я хочу сделать?

ответ

3

Ищете все фрагменты в документе, возвращая содержащий элемент и выделяя их можно сделать с каратов: ходить и КТС: фрагмент кода

xquery version "1.0-ml"; 


let $content := <pdf2xml> 
    <page pageNo="1">xxxxxxxxxxxxxx 1 xxxxxxxxx</page> 
    <page pageNo="2">xxxxxxxxxxxxxx 2 xxxxx foo xxxxxxxx</page> 
    <page pageNo="3">xxxxxxxxxxxxxxx 3 xxxxxxxxxxxxxxxxxxxxxxx</page> 
    <page pageNo="4">xxxxxxxxxxxxxxxxx 4 xxxxxxxxxxx foo xxxxxxxxxx</page> 
</pdf2xml> 

let $q := cts:word-query("foo") 

return <results> 
{cts:walk($content, $q , 
    <result> 
    <original-node>{$cts:node/parent::*}</original-node> 
    <highlighted-content>{cts:highlight($cts:node/parent::*, $q, <matched>{$cts:text}</matched>)}</highlighted-content> 
    </result> 
)} 
</results> 

Результаты в:

<results> 
    <result> 
    <original-node> 
     <page pageNo="2">xxxxxxxxxxxxxx 2 xxxxx foo xxxxxxxx</page> 
    </original-node> 
    <highlighted-content> 
     <page pageNo="2">xxxxxxxxxxxxxx 2 xxxxx <matched>foo</matched> xxxxxxxx</page> 
    </highlighted-content> 
    </result> 
    <result> 
    <original-node> 
     <page pageNo="4">xxxxxxxxxxxxxxxxx 4 xxxxxxxxxxx foo xxxxxxxxxx</page> 
    </original-node> 
     <highlighted-content> 
     <page pageNo="4">xxxxxxxxxxxxxxxxx 4 xxxxxxxxxxx <matched>foo</matched> xxxxxxxxxx</page> 
     </highlighted-content> 
    </result> 
</results> 

Этом может быть не так, как вы хотите, но я по-прежнему предлагаю вам пример некоторой мощности, доступной вам для управления вашими результатами (или, например, извлечение и выделение контента в результате поиска или нет)

4

xpath к узлу, который содержит совпадение, находится в атрибуте path элемента search: match. Когда я пытаюсь ваш пример выше (подставляя значение «ABC» в одной из страниц), я получаю следующий ответ от поиска: фрагмент кода:

<search:snippet xmlns:search="http://marklogic.com/appservices/search"> 
<search:match path="fn:doc("test.xml")/pdf2xml/page[1]"> 
<search:highlight>abc</search:highlight> 
</search:match> 
</search:snippet> 

Обратите внимание на атрибут путь в поиске: матч элемент «Fn: doc ("test.xml")/pdf2xml/page 1 ". Это сообщает вам, какая страница соответствует. Вы можете получить доступ к этому узлу, передав его в xdmp: unpath().

Вы можете получить больше фрагментов или иным образом настроиться фрагменты кода, следуя документы: Modifying Your Snippet Results

Однако, вы могли бы вместо того, чтобы рассмотреть вопрос о вспыхивают страниц на отдельные документы меньшего размера, так что вы можете определить, какой документ соответствует, а не который страницы в большом документе pdf. Когда это возможно, более мелкие документы по гранулярности могут быть проще в управлении и более эффективными для поиска.