У меня есть cts: word-query, в котором число в качестве текстового значения. cts:search(fn:doc(),cts:word-query("226"))

Этот запрос получит результаты, соответствующие только 226 в документах. Но мне также нужны документы, в которых есть 0026.

Пример: это abc.xml

<a>
<b>00226</b>
</a>

Это abc1.xml

<a>
<b>226</b>
</a>

Если я задаю запрос как cts:search(fn:doc(),cts:word-query("226")), он получит только abc1.xml, а если запрос - cts:search(fn:doc(),cts:word-query("00226")), он получит только abc.xml.

Но мне нужно получить оба документа, независимо от ведущих нулей.

3
Kishan Ashra 1 Мар 2016 в 08:46

2 ответа

Лучший ответ

Самый простой способ - использовать подстановочный знак ( * ) и добавить параметр wildcarded

cts:search(fn:doc(),cts:word-query("*226", ('wildcarded')))

РЕДАКТИРОВАТЬ:

Хотя это соответствует примерам документов, как указывает Кишан в комментариях, подстановочный знак также соответствует нежелательным документам (например, содержащим "226226").

Поскольку в этом случае индексы диапазона не подходят, потому что данные смешаны, вот альтернативный прием:

cts:search(
    fn:doc(),
    cts:word-query(
        for $lead in ('', '0', '00', '000') 
        return $lead || "226"))

Очевидно, это зависит от того, сколько может быть ведущих нулей, и будет работать, только если это известно и ограничено.

6
chriskelly 11 Мар 2016 в 15:57

Вы можете добавить индекс диапазона элементов к элементу <b> в базе данных со скалярным типом int или long, затем выполните следующий запрос, он должен вернуть оба документа:

let $query := cts:element-range-query(xs:QName("b"),"=",00226)
return cts:search(fn:doc(),$query)
4
grtjn 1 Мар 2016 в 08:36