Перемещение куда в 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 { . }
Другие вопросы по тегам