(Этот вопрос связан с попыткой реализовать ответ на вопрос, заданный кем-то еще несколько лет назад на игнорируемые элементы 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
, найденного в верхней части этого вопроса).