Marklogic: как искать документы с помощью регулярного выражения?

#xquery #marklogic #marklogic-8 #marklogic-9

#xquery #marklogic #marklogic-8 #marklogic-9

Вопрос:

Недавно я начал работать с базой данных MarkLogic 10

Что мне нужно сделать, это найти документы, у которых есть идентификатор, подобный

wew35r-ui856-iiu

Когда я запрашиваю вот так

 cts:element-value-match(xs:Qname("id"),".*-.*")
  

Я получаю 0 результатов

но когда я делаю

 fn:matches("wew35r-ui856-iiu",".*-.*")
It return true
  

И удивительно, когда я делаю

 cts:element-value-match(xs:Qname("id"),"*")
  

Я получаю целый список, который также включает wew35r-ui856-iiu.

Я просмотрел документацию и все, но не смог заставить ее работать.

Ответ №1:

Для cts:element-value-match не поддерживаются полные шаблоны регулярных выражений, только шаблоны подстановочных знаков.

Использовать шаблон подстановки для поиска значений, содержащих тире - :

 cts:element-value-match(xs:QName("id"),"*-*")
  

И затем, если вам нужно, вы могли бы отфильтровать эти результаты с помощью более конкретного регулярного выражения в фильтре предикатов:

 cts:element-value-match(xs:QName("id"),"*-*")[matches(., "(w -w ){2}")]
  

Комментарии:

1. Сноска к этому полезному объяснению: cts:element-value-match() сопоставляет документы на основе запроса по индексам, где fn:matches() фильтры проверяют документы в памяти. Для хорошей производительности в масштабе лучше всего выполнять как можно больше запросов к индексам и как можно меньше фильтрации в памяти.