XQuery - 为什么结果有差异?

时间:2013-09-27 05:56:49

标签: xquery basex

<Docs>
 <Doc>
   <Title>Electromagnetic Fields</Title>
    <Info>
      <Vol name="Physics"/>
      <Year>2006</Year>
    </Info>
    <SD>
      <Info>
        <Para>blah blah blah.<P>blh blah blah.</P></Para>
      </Info>
    </SD>
    <LD>
      <Info>
        <Para>blah blah blah.<P>blah blah blah.</P></Para>
        <Para>blah blah blah.<P>blah blah blah.</P></Para>
        <Para>blah blah blah.<P>emf waves blah.</P></Para>
        <Para>blah blah blah.<B>emf waves</B> blah.</Para>
        <Para>blah blah blah.<P>emf waves blah.</P></Para>
        <Para>blah waves blah.<B>emf</B> waves blah.</Para>
        <Para>emf blah blah.<I>waves blah.</I></Para>
        <Para>blah blah blah.<B>emf waves</B> blah.</Para>
        <Para>blah blah blah.<P><I>emf</I> waves blah.</P></Para>
      </Info>
    </LD>
</Doc>      
</Docs>

查询1 -

for $x in ft:search("Article", ("emf","waves"), map{'mode':='all words'})/ancestor::*:Doc
  return $x/Title

我得到62次点击

查询2 -

for $x in ft:search("Article", ("emf","waves"), map{'mode':='all words'})
  return $x/ancestor::*:Doc/Title

我得到159次点击

查询3 -

for $x in doc("Article")/Doc[Info[Vol/@name="Physics" and Year ge "2006" and Year le "2010"]]
[SD/Info/Para/text() contains text {"emf","waves"} all words or
SD/Info/Para/P/text() contains text {"emf","waves"} all words or
LD/Info/Para/text() contains text {"emf","waves"} all words or
SD/Info/Para/P/text() contains text {"emf","waves"} all words or
SD/Info/Para/P/B/text() contains text {"emf","waves"} all words or
SD/Info/Para/P/I/text() contains text {"emf","waves"} all words or
SD/Info/Para/P/U/text() contains text {"emf","waves"} all words]
    return $x/Title

这导致224次点击。在第三个,我使用实际存在的所有节点。 IBU用于斜体,粗体和下划线。

为什么会出现这种差异?

2 个答案:

答案 0 :(得分:1)

查询1和2看起来几乎相同,但Q1中的路径表达式会产生Doc个元素。因此,如果单个Doc下方有多个匹配节点,则Doc在Q1中仅计数一次,而每个节点在Q2中单独计数。这是因为根据定义,路径表达式产生的节点序列是无副本的。

Q3不同,但Q1和Q2依赖于全文索引的属性,而Q3则不然。如果是该索引区分大小写,您获得的结果将少于contains text谓词。

因此,从引用的计数来看,我假设文本索引在62个文档中出现了159个匹配节点,而被指定为比普通contains text更具限制性。

答案 1 :(得分:1)

您的第一个查询会搜索具有特定属性的Doc元素,并为每个此类Doc元素返回一个结果。

您的第二个查询搜索具有(相关)属性的任何类型的节点,并为每个此类节点返回一个结果。

您的第三个查询搜索具有另一个(相关)属性的文本节点。

每当有Doc个元素包含多个与全文搜索条件匹配的节点时,第一个和第二个查询将返回不同数量的匹配。对于第三个查询,与其他查询类似。