阅读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)
更新:
问题可能出在该中间内部结果(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。
新构造的元素与原始元素没有任何关系(即,被包装的节点丢失了其标识)。因此,你将不再能够使用全文本索引对其进行查询。
(虽然有多余,但我要添加它,以便注册答案。如上所述,完整的讨论发生在https://sourceforge.net/p/exist/mailman/message/37170946/中。)