全文 Xquery (Lucene/KWIC) 不适用于 "tagged" 结果。 eXist-db 错误?
Fulltext Xquery (Lucene/KWIC) doesn't work on "tagged" result. eXist-db bug?
在阅读了 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
此查询 return 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) 从每个集合中 select 满足我的标准的文件; 2) 从 selected 文件(来自两个集合)中提取我需要的数据; 3)从这个数据构造组合中间内部结果(这里我把<tag>
放在这个结果的一部分,我想进行全文查询); 4) 对这个组合的中间内部结果进行全文查询(只有一个)。
也许我错了,这种方法不是最优化的……
更新和回答
感谢 eXist-db 邮件列表社区,尤其是 Joe。
答案是:
[...] the newly constructed element has no connection to the original one
(i.e., the wrapped node loses its identity), and you are no longer
able to query it using the full text index [...]
在此处查看完整答案和可能的解决方法:https://sourceforge.net/p/exist/mailman/message/37170946/
所以我想将此问题标记为已回答,但我不想 post 将答案设为我的;答案来自 eXist-db 邮件列表。
新构造的元素与原始元素没有任何联系(即包装节点失去了身份)。因此,您无法再使用全文索引对其进行查询。
(虽然多余,但我添加了这个以便注册答案。如前所述,完整的讨论发生在 https://sourceforge.net/p/exist/mailman/message/37170946/.)
在阅读了 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
此查询 return 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) 从每个集合中 select 满足我的标准的文件; 2) 从 selected 文件(来自两个集合)中提取我需要的数据; 3)从这个数据构造组合中间内部结果(这里我把<tag>
放在这个结果的一部分,我想进行全文查询); 4) 对这个组合的中间内部结果进行全文查询(只有一个)。
也许我错了,这种方法不是最优化的……
更新和回答
感谢 eXist-db 邮件列表社区,尤其是 Joe。 答案是:
[...] the newly constructed element has no connection to the original one (i.e., the wrapped node loses its identity), and you are no longer able to query it using the full text index [...]
在此处查看完整答案和可能的解决方法:https://sourceforge.net/p/exist/mailman/message/37170946/
所以我想将此问题标记为已回答,但我不想 post 将答案设为我的;答案来自 eXist-db 邮件列表。
新构造的元素与原始元素没有任何联系(即包装节点失去了身份)。因此,您无法再使用全文索引对其进行查询。
(虽然多余,但我添加了这个以便注册答案。如前所述,完整的讨论发生在 https://sourceforge.net/p/exist/mailman/message/37170946/.)