首页 > 解决方案 > 3 个查询总和不等于数据库中总文档数的精确值?

问题描述

我有3个场景-

  1. xyz获取具有元素名称和的所有文档的总文档数abc。在这种情况下,我还需要元素名称的值。例如,文档的文档计数,其中元素名称xyz值是lala,元素名称abc值是lili等等,对于所有可能的值/xyz和的组合abc。这两个元素都应该存在于文档中。
  2. xyz获取具有元素名称且元素abc在该文档中不存在的所有文档的总文档数。在这种情况下,我需要所有可能的xyz值明智的文档的文档计数。
  3. 获取不包含 element 的文档的总文档数xyz。这三个加起来应该等于数据库的总文档数。
    注意:数据库很大。查询必须很快。我可以在精度上稍微妥协。我需要避免通配符搜索。帮助。

    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())
                      )) )
             )

标签: xquerymarklogic

解决方案


一般来说,通用索引可以通过将查询传递给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()
  )

希望有帮助,


推荐阅读