eXist-db-XQuery-Lucene-使用回调参数控制KWIC函数中的输出

时间:2018-11-15 09:30:58

标签: xpath lucene xquery exist-db

(此问题与尝试实施几年前在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:notetei: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:notetei: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处找到的元素中查找要忽略的元素这个问题的顶部)。

0 个答案:

没有答案