忽略的XML元素显示在eXist db';s lucene搜索结果

忽略的XML元素显示在eXist db';s lucene搜索结果,lucene,xquery,exist-db,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"> &

我正在用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>
但应该导致

 ....sucht. Wie Liebe   Ausströmung     inneren Wertes ist,...
当我搜索“Hass”时,这个文本片段不会显示在结果中


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

让我们从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元素的赋值移出函数,例如移到查询序言中声明的变量,这样就不会为遇到的每个文本节点调用数据库(collection.xconf):这真是愚蠢,但是为了简单起见,我把所有的函数都放在了一个函数中


PS:名称空间前缀可以是任何您选择的,但是名称空间的标准名称空间前缀是“tei”,将其更改为“TEIN”只会导致混淆。

谢谢,这解决了我的问题。目前,我正在开发去年5月安装的Verion,因此过滤功能看起来有点不同。最后一件事:是否可以以动态方式检索“/db/system/config/db/apps/shakespeare/collection.xconf”?如果我将应用程序移动到另一个文件夹,路径也会更改。我把它改成了doc(fn:concat('/db/system/config',$config:app root,'/collection.xconf')),但看起来非常混乱和丑陋。有没有更好的解决方案来访问应用程序根目录下的真实集合?如果你认为这是混乱和丑陋的,你最好开始习惯它-这就是一个好的应用程序是如何构建的。我个人觉得它很美请将问题标题中的“忽略的XML属性”更正为“忽略的XML元素”?-您是否在查询序言中声明并绑定$ignored元素?
 ....sucht. Wie Liebe   Ausströmung     inneren Wertes ist,...
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)
};