2013-07-18 91 views
2

鑑於此查詢:移動到哪裏CTS:搜索

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> 

如何移動「何處」約束到CTS搜索查詢?

回答

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:URI的會快於使得許多重複調用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 { . } 
+1

優秀的答案,但一個'CTS:元素值query'可能比嵌套'CTS有更好的表現:元素query'和'CTS:字處理query'。另外,考慮到'document-uri'的調用,使用'cts:uris'而不是'cts:search'可能會更好:http://stackoverflow.com/a/17710863/908390有一個例子。 – mblakele