(此问题与尝试实施几年前在Ignored XML elements show up near eXist-db's lucene search results上其他人提出的问题的答案有关)
在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>
我的搜索集中在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文档(和this SO question),通过附加的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
处找到的元素中查找要忽略的元素这个问题的顶部)。