鉴于此文件:-

<items>
  <item><type>T1</type><value>V1</value></item>
  <item><type>T2</type><value>V2</value></item>
</items>

毫不奇怪,我发现这将以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')
    )
  ))

但有些令人惊讶(至少对我来说),我也发现这也会:-
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')
    ))
  )

这似乎不正确,因为没有单个项目的 type = T1 value = V2
对我来说,这似乎是错误的肯定。

我是否误解了cts:element-query的工作原理?
(我不得不说文档在这方面不是特别清楚)。

还是,MarkLogic 努力为我提供我期望的结果,并且如果我拥有更多或更好的索引,那么我不太可能得到错误的肯定匹配。

最佳答案

除了@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'
)

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

正如@wst所说,cts:search()默认运行过滤,而cts:uris()(例如xdmp:estimate()仅未过滤运行)。

HTH!

关于xquery - MarkLogic cts :element-query false positives?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37398150/

10-13 07:48