<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
,B
和U
用于斜体,粗体和下划线。
为什么会出现这种差异?
答案 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
个元素包含多个与全文搜索条件匹配的节点时,第一个和第二个查询将返回不同数量的匹配。对于第三个查询,与其他查询类似。