0
<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 次点击。在第三个中,我使用了所有实际存在的节点。I,BU用于斜体、粗体和下划线文本。

为什么会有这种差异?

4

2 回答 2

1

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

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

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

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

于 2013-09-30T18:16:47.693 回答
1

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

Q3 不同,但 Q1 和 Q2 取决于全文索引的属性,而 Q3 则不。例如,如果索引区分大小写,则从它获得的结果将少于从contains text谓词中获得的结果。

因此,根据引用的计数,我假设 text 索引在 62 个文档中包含 159 个匹配节点,同时被指定为比普通contains text.

于 2013-09-30T18:11:39.233 回答