MarkLogic cts:元素查询误报?

And*_*Key 6 xquery false-positive marklogic

鉴于此文件: -

<items>
  <item><type>T1</type><value>V1</value></item>
  <item><type>T2</type><value>V2</value></item>
</items>
Run Code Online (Sandbox Code Playgroud)

不出所料,我发现这将拉回页面cts:uris(): -

cts:and-query((
  cts:element-query(xs:QName('item'),
    cts:element-value-query(xs:QName('type'),'T1')
    ),
  cts:element-query(xs:QName('item'),
    cts:element-value-query(xs:QName('value'),'V2')
    )
  ))
Run Code Online (Sandbox Code Playgroud)

但有点令人惊讶(至少对我来说)我也发现这也是: -

cts:element-query(xs:QName('item'),
  cts:and-query((
    cts:element-value-query(xs:QName('type'),'T1'),
    cts:element-value-query(xs:QName('value'),'V2')
    ))
  )
Run Code Online (Sandbox Code Playgroud)

这似乎不对,因为没有type = T1value = V2的单个项目.对我来说,这似乎是一种误报.

我误解了cts:element-query有效吗?(我不得不说文档在这个领域并不是特别清楚).

或者这是MarkLogic努力向我提供我期望的结果的东西,并且如果我有更多或更好的索引,我将不太可能得到误报.

grt*_*tjn 5

除了@wst的答案之外,您只需要启用element value positions从未过滤的搜索中获得准确的结果.这里有一些代码可以显示:

xdmp:document-insert("/items.xml", <items>
  <item><type>T1</type><value>V1</value></item>
  <item><type>T2</type><value>V2</value></item>
</items>);

cts:search(collection(),
  cts:element-query(xs:QName('item'),
    cts:and-query((
      cts:element-value-query(xs:QName('type'),'T1'),
      cts:element-value-query(xs:QName('value'),'V2')
    ))
  ), 'unfiltered'
)
Run Code Online (Sandbox Code Playgroud)

如果未element value positions启用,则返回测试文档.启用位置后,查询不返回任何内容.

正如@wst所说,cts:search()默认情况下运行过滤,而cts:uris()(例如,xdmp:estimate()只运行未过滤.

HTH!