Перемещение куда в 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?
1 ответ
Решение
Это использует 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 { . }