XQuery - Почему есть разница в результате?

<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 используются для курсива, полужирного шрифта и подчеркивания текста.

Почему эта разница?


person John    schedule 27.09.2013    source источник
comment
Вы должны предоставить нам образец документа, иначе на этот вопрос нельзя будет ответить.   -  person Jens Erat    schedule 27.09.2013
comment
@JensErat - Хорошо. Я отредактирую сообщение и добавлю пример документа.   -  person John    schedule 27.09.2013


Ответы (2)


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

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

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

person Gunther    schedule 30.09.2013

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

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

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

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

person C. M. Sperberg-McQueen    schedule 30.09.2013