忽略的XML元素显示在eXist db';s lucene搜索结果
我正在用eXist db构建一个应用程序,它可以处理TEI文件并将它们转换成html 对于搜索功能,我将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"> &
<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)
};