鉴于此查询:
for $d in cts:search(
fn:doc(),
cts:and-query(
(
cts:collection-query(('InProgress_Audit'))
)
))
where not(fn:contains($d//TitleDate/text(),"Z"))
return <p>{document-uri($d)}</p>
如何将“where”约束移动到CTS搜索查询中?
答案 0 :(得分:3)
这使用cts:query
来应用约束:
for $d in cts:search(
fn:doc(),
cts:and-not-query(
cts:collection-query('InProgress_Audit'),
cts:element-query(xs:QName('TitleDate'),
cts:word-query('*Z*', 'wildcarded'))
))
return <p>{document-uri($d)}</p>
有加速通配搜索的索引选项。您还可以将TitleDate
上的范围索引与cts:element-range-index-query
结合使用,以进一步提高速度。
更新:@mblakele在评论中指出,cts:element-value-query
可能比嵌套cts:element-query
/ cts:word-query
更快:
cts:element-value-query(xs:QName('TitleDate'), '*Z*', 'wildcarded')
使用cts:uris比重复调用document-uri()
要快。但是,您需要在设置中启用URI词典选项。把所有这些放在一起,查询看起来像:
cts:uris((), 'document',
cts:and-not-query((
cts:collection-query('InProgress_Audit'),
cts:element-value-query(xs:QName('TitleDate'),
'*Z*', 'wildcarded')
))) ! element p { . }