移动到cts:搜索

时间:2013-07-18 13:38:32

标签: xquery marklogic cts-search

鉴于此查询:

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搜索查询中?

1 个答案:

答案 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 { . }