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 <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)
更新:
-
感谢 eXist-db 邮件列表的建议。
问题可能在于此中间内部结果没有索引 (return <tag>$node</tag>
)。即使<tag>
被添加到索引配置中,这个<tag>
在索引构建时也不存在......
如果这是问题所在,那么问题是如何在中间内部结果上放置索引。甚至可能吗?也许有人有一些线索? eXist-db 文档不是很有帮助。我发现最接近这个的是:https://exist-db.org/exist/apps/doc/lucene#constructed-fields
-
为什么我还要把这个
<tag>
放在这里?
我有两个数据非常相似但 XML 模式不同的集合,因此我必须分别查询它们(但我需要一个共同的结果)。所以现在我对每个集合都有两个全文查询,然后我结合获得的结果。我的目标是优化:从两个全文查询(慢)到只有一个(快)。为此,我会 1) 从每个集合中选择符合我标准的文件; 2)从选定的文件(来自两个集合)中提取我需要的数据; 3)从这个数据构造组合中间内部结果(这里我把<tag>
放在我想要进行全文查询的这个结果的部分); 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 错误?的主要内容,如果未能解决你的问题,请参考以下文章