Warm tip: This article is reproduced from serverfault.com, please click

xml-全文Xquery(Lucene / KWIC)不适用于“已标记”结果。

(xml - Fulltext Xquery (Lucene/KWIC) doesn't work on "tagged" result. eXist-db bug?)

发布于 2020-12-06 23:31:48

阅读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 <tag>{$node}</tag>

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")]等...
  • 添加<tag>索引配置(<text qname="tag"/>

我错过了什么?还是eXist-db错误?(我的eXist版本:4.7.0)

更新:

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

问题可能出在该中间内部结果return <tag>$node</tag>上没有索引即使<tag>已将其添加到索引配置中,<tag>在建立索引时也不存在。如果这是问题,那么问题是如何在中间内部结果上放置索引。可能吗?也许有人有线索?eXist-db文档不是很有帮助。我找到的最接近的是:https : //exist-db.org/exist/apps/doc/lucene#constructed-fields

  1. 为什么我什至需要把它放在<tag>这里?

我有两个集合,它们的数据非常相似,但是XML模式不同,因此必须分别查询它们(但是我需要一个通用的结果)。因此,现在我对每个集合进行两个全文查询,然后将获得的结果合并。我的目标是优化:从两个全文查询(慢速)到仅一个(快速)查询。为此,我这样做1)从每个集合中选择符合我的条件的文件;2)从选定的文件(来自两个集合)中提取我需要的数据;3)从此数据构造中合并中间内部结果(在此我放在<tag>此结果中要进行全文查询的部分);4)对此组合的中间内部结果进行全文查询(仅一个)。也许我错了,这种方法并不是最优化的……

更新和答案

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

[...]新构造的元素与原始元素没有任何关系(即,被包装的节点丢失了其标识),并且你不再能够使用全文本索引来查询它。[...]

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

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

Questioner
ag_1812
Viewed
0
joewiz 2021-01-10 01:55:13

新构造的元素与原始元素没有任何关系(即,被包装的节点丢失了其标识)。因此,你将不再能够使用全文本索引对其进行查询。

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