我试图了解element word positions
索引设置的影响.请参阅以下xquery,它返回简单element-word-query
搜索的计划:
xdmp:plan(cts:search(doc(),
cts:and-query(
cts:element-word-query(xs:QName("name"), "element word position")
),
("unfiltered")
))
Run Code Online (Sandbox Code Playgroud)
并且final-plan
如果索引没有被激活(还原形式,以节省空间):
<qry:and-query>
<qry:term-query>element(name),pair(word("element"),word("word"))</qry:term-query>
<qry:term-query>element(name),pair(word("word"),word("position"))</qry:term-query>
<qry:term-query>word("element")</qry:term-query>
<qry:term-query>word("word")</qry:term-query>
<qry:term-query>word("position")</qry:term-query>
</qry:and-query>
Run Code Online (Sandbox Code Playgroud)
索引激活后的查询计划(word-positions
以及element word positions
):
<qry:and-query>
<qry:term-query>element(name),pair(word("element"),word("word"))</qry:term-query>
<qry:term-query>element(name),pair(word("word"),word("position"))</qry:term-query>
<qry:element-query>
element(name)
<qry:word-query>
<qry:KP pos="0">word("element")</qry:KP>
<qry:KP pos="1">word("word")</qry:KP>
<qry:KP pos="2">word("position")</qry:KP>
</qry:word-query>
</qry:element-query>
</qry:and-query>
Run Code Online (Sandbox Code Playgroud)
所以我假设,因为term-query
生成的数量较少,所得到的候选片段id计数将会更小,因此索引分辨率的交集更快.除此之外,我真的很想了解一下如何element-query
在幕后工作.所以我有几个问题:
element word positions
激活了索引中保存了哪些附加信息?element-query
执行?我看到一个简单的term-query
返回短线重要的倒排表,但我不知道如何element-query
与word-query
作为"子查询"是evalutated.编辑:添加了一张图片,可视化我对索引在启用元素字位置时的外观的理解.(有关详细信息,请参阅mholstege的答案评论)
小智 5
当您打开头寸时,我们会在相关术语的索引中存储每个文档的位置向量,而不仅仅是文档ID.
考虑这一点的方法是根据叶子查询的特殊性以及计算它们和交叉中间结果所涉及的工作.
当您在查询计划中看到一个术语查询时,这意味着它只是查找文档ID,因此不知道相对定位 - 对于这样的长词而言,这是一个不太准确的结果,因为"元素词"和"单词位置"可能出现在文档中的两个单独的父元素中.如果您的数据在每个文档中只有一个具有此名称的元素,则不会发生这种情况,尽管您仍然可能存在错误匹配,其中双字子句发生在相反的顺序中,或者由其他单词分隔.
当您在查询计划中看到单词查询时,这意味着我们将查看位置,在这里您可以看到短语中每个单词的相对位置.当这个问题得到解决时,我们会检查位置向量并抛出那些不代表这种位置约束的向量.因此,所有匹配将按此顺序具有此序列的单词:更精确的匹配.
计划中的元素查询还应用元素实例相对于元素内匹配的位置约束.存在优化,其中元素位置约束实际上被推送到查询树的叶子以避免过多的中间计算.
您还会看到一些技术上冗余的术语查询:这些问题的关键是要进行简单的术语查找,这些查找可能比叶词查询更受限制.由于来自和查询的术语列表的交集总是从最短匹配发布列表开始,因此这可以提供快速失败机制以避免更昂贵的位置计算.其中有一定数量的启发式判断,并且考虑到一组复杂的索引选项和查询变体,有时这些附加术语实际上没有用.