eXist-db - XQuery - Lucene - управление выводом в функции KWIC с параметром обратного вызова - PullRequest
0 голосов
/ 15 ноября 2018

(Этот вопрос связан с попыткой реализовать ответ на вопрос, заданный кем-то еще несколько лет назад на игнорируемые элементы XML, отображаются рядом с результатами поиска eXist-db * lucene )

В eXist-db 4.4 у меня есть следующее определение индекса Lucene:

<collection xmlns="http://exist-db.org/collection-config/1.0">
  <index xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <lucene>
        <analyzer class="org.apache.lucene.analysis.standard.StandardAnalyzer"/>
        <text qname="tei:seg"/>
        <text qname="tei:persName"/>
        <text qname="tei:placeName"/>
        <ignore qname="tei:note"/>
        <ignore qname="tei:pb"/>
        <ignore qname="tei:gap"/>
        <ignore qname="tei:del"/>
        <ignore qname="tei:orig"/>
        <inline qname="tei:supplied"/>
    </lucene>
</index

Он применяется к содержимому, которое всегда выглядит так:

 <seg type="dep_event" subtype="event" xml:id="MS609-0209-2">Item. Alia 
   <del type="notary" rend="expunctus">die</del> vice vidit 
   <placeName type="event_loc" nymRef="#home_of_Cap-de-Porc">in eodem hospitio</placeName> 
   <persName nymRef="#Bernard_Cap-de-Porc_MSP-AU" role="her">Bernardum</persName>
   <note type="public">Assumed Bernard Cap-de-Porc based on <foreign xml:lang="LA">eodem hospitio</foreign>.</note> et socium suum, hereticos. Et vidit ibi cum eis 
   <persName nymRef="#Arnald_Godalh_MSP-AU" ana="#pAdo" role="par">Arnaldum<lb break="y" n="7"/>Godalh</persName>; et 
   <persName nymRef="#Guilhem_de_Rosengue_MSP-AU" ana="#pAdo #pBring" role="par">W<supplied reason="expname">illelmum</supplied>, 
        <roleName type="fam">filium dicti testis</roleName></persName>, 
     qui duxit ipsum testis ad dictos hereticos; et ipsum 
    <persName nymRef="#Peire_Cap-de-Porc_MSP-AU" ana="#pAdo" role="par">Cap de Porc</persName> et 
    <persName nymRef="#Susanna_Cap-de-Porc_MSP-AU" ana="#pAdo" role="par"/>uxorem eius. Et 
    <persName nymRef="#Arnald_de_Rosengue_MSP-AU" ana="#pAdo" role="par"/>ipse testis et omnes alii adoraverunt<lb break="y" n="8"/>ibi dictos hereticos. Et 
    <date type="event_date" when="1240">sunt V anni vel circa</date>.
  </seg>

Myпоиск фокусируется на содержимом, найденном внутри tei:seg, но я хочу игнорировать некоторые элементы, найденные внутри, такие как tei:note и tei:del.Движок Lucene правильно игнорирует эти поля.Запрос выглядит следующим образом:

let $query := 
           <query>
             <term>hospitio</term>
           </query>

for $hit in collection($URIdata)//tei:text/tei:body//tei:seg[@type="dep_event"][ft:query(.,$query)]                                           

order by ft:score($hit) descending

return
    kwic:summarize($hit, <config width="80" table="yes"/>)

И запрос возвращает следующее через kwic:summarize функцию.Ни tei:note, ни tei:del не игнорируются ....

<tr>
   <td class="previous">Item. Alia die vice vidit 
           in eodem </td>
   <td class="hi">hospitio</td>
   <td class="following">Bernardum Assumed Bernard Cap-de-Porc based on e...</td>
</tr>

Согласно документации eXist-db (и этот вопрос SO ) подавление вывода на экран этих элементовконтролируется с помощью дополнительного параметра callback.Я пытался добавить обратный вызов в запросе:

kwic:summarize($hit, <config width="80" table="yes"/>, search:kwic-filter)

... который запрашивает эту функцию:

declare %private function search:kwic-filter($node as node(), $mode as xs:string) as xs:string? {
let $ignored-elements := doc(concat($globalvar:URIdb,"collection.xconf"))//*:ignore/@qname/string()
let $ignored-elements := 
    for $ignored-element in $ignored-elements
    let $ignored-element := substring-after($ignored-element, ':')
    return $ignored-element
return
    if (local-name($node/parent::*) = ($ignored-elements)) 
    then ()
    else 
        if ($mode eq 'before') 
        then concat($node, ' ')
        else concat(' ', $node)

... но я получаю ошибку

err: XPDY0002 Неопределенная контекстная последовательность для 'child :: search: kwic-filter'

Мне не хватает как общаться между запросом и обратным вызовом и, возможно, как написать обратный вызовв этом случае (обратите внимание, что функция обратного вызова ищет элементы для игнорирования из collection.xconf, найденного в верхней части этого вопроса).

...