忽略的XML元素出现在eXist-db的lucene搜索结果附近

时间:2014-01-18 03:55:12

标签: lucene xquery exist-db

我正在使用eXist-db构建一个应用程序,它可以处理TEI文件并将它们转换为html。

对于搜索功能,我将lucene配置为忽略某些标记。

<collection xmlns="http://exist-db.org/collection-config/1.0" xmlns:teins="http://www.tei-c.org/ns/1.0">
    <index xmlns:xs="http://www.w3.org/2001/XMLSchema">

       <fulltext default="none" attributes="false"/>

        <lucene>
        <analyzer class="org.apache.lucene.analysis.standard.StandardAnalyzer"/>
        <analyzer id="ws" class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>
            <text match="//teins:TEI">

                <inline qname="p"/>
                <inline qname="text"/>

                <ignore qname="teins:del"/>
                <ignore qname="teins:sic"/>
                <ignore qname="teins:index"/>
                <ignore qname="teins:term"/>
                <ignore qname="teins:note"/>

            </text>
        </lucene>


    </index>
</collection>

嗯,这样做有点,元素不会直接显示在搜索结果中,而是出现在匹配文本之前和之后的片段中,这些片段由kwic模块返回。有没有办法在索引之前删除它们或应用XSL转换?

示例TEI:

...daß er sie zu entwerten sucht. Wie 
                   <index>
                        <term>Liebe</term>
                        <index>
                            <term>und Hass</term>
                        </index>
                    </index>
Liebe Ausströmung inneren Wertes ist,... 

当我搜索“Ausströmung”时,查询结果为

 ....sucht. Wie Liebe und Hass Liebe    Ausströmung     inneren Wertes ist,...

但应该导致

 ....sucht. Wie Liebe   Ausströmung     inneren Wertes ist,...

当我搜索“Hass”时,此文本代码段不会显示在结果中。

对于搜索功能:我严格遵守文档中的莎士比亚示例。

1 个答案:

答案 0 :(得分:2)

让我们来看看eXist-db的莎士比亚应用程序。假设你有索引条目。您不希望索引术语中的命中 - 这是索引配置的处理 - 但您也不希望它们输出到KWIC显示 - 您必须自己编码。

如果查看app.xql,您会看到有一个名为app:filter的函数来自app:show-hits。这可以用来根据输出的文本节点的父节点的名称删除部分输出到KWIC显示。

这将给你想要的东西:

declare %private function app:filter($node as node(), $mode as xs:string) as xs:string? {
    let $ignored-elements := doc('/db/system/config/db/apps/shakespeare/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::*) = ('speaker', 'stage', 'head', $ignored-elements)) 
        then ()
        else 
            if ($mode eq 'before') 
            then concat($node, ' ')
            else concat(' ', $node)
};

你当然可以硬编码要忽略的元素,如('speaker', 'stage', 'head', 'sic', 'term', 'note')(这里不需要'index',因为你必须总是使用'​​term'),但我想表明你没有至。但是,如果你不对要忽略的元素进行硬编码,你当然应该将$ ignored-elements的赋值从函数中移出,例如移动到查询序言中声明的变量,因此数据库(collection.xconf)会不会为你遇到的每个文本节点调用:这真的很愚蠢,但为了简单起见,我已将所有功能放在一个函数中。

PS:名称空间前缀可以是您选择的任何内容,但http://www.tei-c.org/ns/1.0名称空间的标准名称空间前缀是“tei”,将其更改为“teins”只会导致混淆。