Fulltext Xquery (Lucene/KWIC) 不适用于“标记”结果。 eXist-db 错误?

Posted

技术标签:

【中文标题】Fulltext Xquery (Lucene/KWIC) 不适用于“标记”结果。 eXist-db 错误?【英文标题】:Fulltext Xquery (Lucene/KWIC) doesn't work on "tagged" result. eXist-db bug? 【发布时间】:2021-03-18 07:36:31 【问题描述】:

在阅读了 XQuery 文档和 eXist-db 文档之后,我想不通。 如果将结果放在标签中,使用 KWIC 进行全文搜索将不起作用。

说明

XML 文件

<root>
    <node>blablabla</node>
    <node>blab KEYWORD labla</node>
    <node>blablabla</node>
</root>

索引配置(collection.xconf)

<collection xmlns="http://exist-db.org/collection-config/1.0">
    <index xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <lucene>
            <text qname="root"/>
            <text qname="node"/>
        </lucene>
    </index>
</collection>

没有“标记”结果的 XQuery(有效) (看return $node

let $my_texts := 
    for $node in collection("path_to_my_collection")//node
    return
        $node

for $my_hit in $my_texts[ft:query(., "KEYWORD")]
return 
    $my_hit

上面的 Xquery 代码有效,我得到了结果。

1
<node>blab KEYWORD labla</node>

但是当启动全文搜索的第一个结果放在标签中时,它不起作用。 (我的整个查询比较复杂,我需要把这个结果放在标签中,以便在我的代码的另一个地方使用它。)

带有“标记”结果的 XQuery(不起作用) (看return &lt;tag&gt;$node&lt;/tag&gt;

let $my_texts := 
    for $node in collection("path_to_my_collection")//node
    return
        <tag>$node</tag>

for $my_hit in $my_texts[ft:query(., "KEYWORD")]
return 
    $my_hit

此查询返回 0 个结果。

当我这样调试时:

用于调试的 XQuery

let $my_texts := 
    for $node in collection("path_to_my_collection")//node
    return
        <tag>$node</tag>

return 
    $my_texts

我明白了:

1
<tag>
    <node>blablabla</node>
</tag>

2
<tag>
    <node>blab KEYWORD labla</node>
</tag>

3
<tag>
    <node>blablabla</node>
</tag>

我尝试了什么:

不同的路径组合:$my_texts/tag[ft:query(., "KEYWORD")]$my_texts/tag/node[ft:query(., "KEYWORD")]$my_texts/*[ft:query(., "KEYWORD")]$my_texts/tag//*[ft:query(., "KEYWORD")]$my_texts//*//*[ft:query(., "KEYWORD")]等... 在索引配置中添加&lt;tag&gt; (&lt;text qname="tag"/&gt;)

我错过了什么?或者它是一个 eXist-db 错误? (我的 eXist 版本:4.7.0)

更新:

    感谢 eXist-db 邮件列表的建议。

问题可能在于此中间内部结果没有索引 (return &lt;tag&gt;$node&lt;/tag&gt;)。即使&lt;tag&gt; 被添加到索引配置中,这个&lt;tag&gt; 在索引构建时也不存在...... 如果这是问题所在,那么问题是如何在中间内部结果上放置索引。甚至可能吗?也许有人有一些线索? eXist-db 文档不是很有帮助。我发现最接近这个的是:https://exist-db.org/exist/apps/doc/lucene#constructed-fields

    为什么我还要把这个&lt;tag&gt;放在这里?

我有两个数据非常相似但 XML 模式不同的集合,因此我必须分别查询它们(但我需要一个共同的结果)。所以现在我对每个集合都有两个全文查询,然后我结合获得的结果。我的目标是优化:从两个全文查询(慢)到只有一个(快)。为此,我会 1) 从每个集合中选择符合我标准的文件; 2)从选定的文件(来自两个集合)中提取我需要的数据; 3)从这个数据构造组合中间内部结果(这里我把&lt;tag&gt;放在我想要进行全文查询的这个结果的部分); 4)对这个组合的中间内部结果进行全文查询(只有一个)。 也许我错了,这种方法不是最优化的……

更新和回答

感谢 eXist-db 邮件列表社区,尤其是 Joe。 答案是:

[...] 新构建的元素与原始元素没有任何联系 (即,被包装的节点失去了它的身份),你不再是 能够使用全文索引查询它[...]

在此处查看完整答案和可能的解决方法:https://sourceforge.net/p/exist/mailman/message/37170946/

所以我想将此问题标记为已回答,但我不想将答案发布为我的;答案来自 eXist-db 邮件列表中的 Joe。

【问题讨论】:

【参考方案1】:

新构造的元素与原始元素没有任何联系(即,被包装的节点失去了它的身份)。因此,您不再能够使用全文索引对其进行查询。

(虽然多余,但我添加了这个以便注册答案。如上所述,完整的讨论发生在https://sourceforge.net/p/exist/mailman/message/37170946/.)

【讨论】:

以上是关于Fulltext Xquery (Lucene/KWIC) 不适用于“标记”结果。 eXist-db 错误?的主要内容,如果未能解决你的问题,请参考以下文章

XPath与Xquery

调试 XQuery 程序

Python下的XQuery库[关闭]

学习 XQuery 的简单工具? [关闭]

XQuery 让让输出

在启动我想要运行的完整 XQuery 之前,如何验证嵌入在较大 XQuery 中的 Lucene 查询不包含语法错误?