2013-09-27 1 views
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 -XQuery - Почему есть разница в результате?

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

Я получаю 62 Hits

Запрос 2 -

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

Я получаю 159 Hits

Запрос 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

Вам необходимо предоставить нам примерный документ, иначе на этот вопрос не будет дан ответ. –

+0

@JensErat - Хорошо. Я отредактирую сообщение и добавлю примерный документ. – John

ответ

1

Запросы 1 и 2 выглядят одинаково, однако выражение пути в Q1 приводит к Doc элементам. Поэтому, если имеется несколько совпадающих узлов ниже одного Doc, то Doc будет считаться только один раз в Q1, тогда как каждый узел подсчитывается отдельно в Q2. Это связано с тем, что последовательность узлов, полученная из выражения пути, по определению, не содержит дубликатов.

Q3 отличается, но в то время как Q1 и Q2 зависят от свойств полнотекстового индекса, Q3 этого не делает. Если, например, индекс чувствителен к регистру, вы получите меньше результатов, чем от предиката contains text.

Итак, из числа цитируемых слов я бы предположил, что текстовый индекс содержит 159 совпадающих узлов в 62 документах, а указывается как более ограничительный, чем простой contains text.

1

Ваш первый запрос выполняет поиск Doc элементов, которые имеют определенное свойство и возвращает один результат для каждого такого элемента Doc.

Ваш второй запрос выполняет поиск узлов любого типа, имеющих (связанное) свойство, и возвращает один результат для каждого такого узла.

Ваш третий запрос ищет текстовые узлы, у которых есть другое (связанное) свойство.

Когда есть Doc элементы, содержащие более одного узла, соответствующие критерию полнотекстового поиска, первый и второй запросы возвращают разные числа обращений. И аналогично для третьего запроса, по отношению к другим.