Сумма 3 запросов не равна точному общему количеству документов в базе данных? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть 3 сценария -

  1. Получить общее количество документов всех документов с именем элемента xyz и abc.В этом случае мне также требуются значения имени элемента.Как, например, подсчет документов, где имя элемента xyz значение равно lala, а имя элемента abc значение равно lili и т. Д. Для всех возможных значений / комбинаций xyz и abc.Оба элемента должны существовать в документе.
  2. Получить общее количество документов всех документов с именем элемента xyz, а элемент abc не существует в этом документе.В этом случае мне нужно количество документов для всех возможных значений xyz.
  3. Получить общее количество документов для документов, которые не содержат элемент xyz.Вместе эти 3 при добавлении должны быть равны общему количеству документов в базе данных.
    Примечание: Размер базы данных огромен.Запрос должен быть быстрым.Я могу немного пойти на компромисс по точности.Мне нужно избегать поиска по шаблону.Помогите.

    xdmp:estimate(cts:search(fn:doc(), cts:and-query(( cts:element-query(xs:QName("meta:xyz"), cts:true-query()),cts:element-query(xs:QName("meta:abc"), cts:true-query()) )) ) ).

Это возвращает разные результаты, чем когда я суммирую все возможные значения, полученные из cts:value-tuples, и передаю 1 на 1 в -

let $x := local:get-doc-count-for-localname-source(cts:value-tuples((
          cts:element-reference(xs:QName("meta:xyz")),
          cts:element-reference(xs:QName("meta:abc"))
          )) ) 
let $y := fn:sum(($x))
return xdmp:estimate(cts:search(fn:doc(), cts:and-query((                
                cts:element-query(xs:QName("meta:xyz"), cts:true-query()),
                cts:element-query(xs:QName("meta:abc"), cts:true-query())
                      )) )
             )

1 Ответ

0 голосов
/ 18 мая 2018

Как правило, универсальный индекс может давать быстрые оценки, передавая запрос к cts.estimate() в серверном JavaScript или xdmp.estimate() в XQuery.

Оценка документов, содержащих как FIRST_ELEMENT, так и SECOND_ELEMENT:

cts.estimate(
  cts.andQuery([
    cts.elementQuery('FIRST_ELEMENT', cts.trueQuery()),
    cts.elementQuery('SECOND_ELEMENT', cts.trueQuery())
  ]))

Оценка документов, содержащих FIRST_ELEMENT, но не SECOND_ELEMENT:

cts.estimate(
  cts.andQuery([
    cts.elementQuery('FIRST_ELEMENT', cts.trueQuery()),
    cts.notQuery(
      cts.elementQuery('SECOND_ELEMENT', cts.trueQuery())
      )
  ]))

Оценка документов, не содержащих FIRST_ELEMENT:

cts.estimate(
    cts.notQuery(
      cts.elementQuery('FIRST_ELEMENT', cts.trueQuery())
      )
  )

Оценка всех документов в базе данных:

cts.estimate(
  cts.trueQuery()
  )

Надеясь, что помогает,

...