2015-04-23 2 views
0

У меня есть переменная $yearMonth := "2015-02" Я должен найти эту дату на элементе Date as xs:dateTime. Я хочу использовать выражение регулярных выражений, чтобы найти все файлы/документы, имеющие эту дату "2015-02- ??" я path-range-index включен ModifiedInfo/Date Я использую следующий код, но получаю ошибку Invalid castcts: value-match on xs: dateTime() type в Marklogic

let $result := cts:value-match(cts:path-reference("ModifiedInfo/Date"), xs:dateTime("2015-02-??T??:??:??.????"))

Я также использовал следующий код и получить ту же ошибку

let $result := cts:value-match(cts:path-reference("ModifiedInfo/Date"), xs:dateTime(xs:date("2015-02-??"),xs:time("??:??:??.????")))

Пожалуйста, помогите :)

ответ

2

Кажется, вы пытаетесь использовать поиск по диким картам в Path Range ind ex, который имеет тип данных xs: dateTime().

Но в настоящее время MarkLogic не поддерживает эту функцию. Существует несколько способов решения этого сценария:

  1. Вы можете создать индекс поля.
  2. Вы можете изменить его на индекс строки, который поддерживает поиск по шаблону.
  3. Вы можете запустить этот обходной путь, чтобы поддержать существующую систему:

    за $ х в КТС: значения (КТС: путь-ссылки («ModifiedInfo/Дата»)) возвращение если (начинается-с (хз : строка ($ х), «2015-02»)), то $ х еще()

Этот запрос будет получать из значений из лексикона, а затем вы можете отфильтровать нужные даты.

+0

Привет Навин, я использовал выше 3 пути, и это помогло. Еще раз спасибо –

0

Вы также можете рассмотреть возможность выполнения значений cts: cc: query param, который ищет значения между, например, 2015-02-01 и 2015-03-01. Однако помните, что если в одном документе происходит несколько дат, вам необходимо будет опубликовать фильтр вручную (как в варианте 3 Navin), но он может потенциально ускорить постфильтрацию.

HTH!

2

Вы можете решить эту проблему путем объединения пары КТС: элемент-диапазона querys внутри от и-запроса:

let $target := "2015-02" 
let $low := xs:date($target || "-01") 
let $high := $low + xs:yearMonthDuration("P1M") 
return 
    cts:search(
    fn:doc(), 
    cts:and-query((
     cts:element-range-query("country", ">=", $low), 
     cts:element-range-query("country", "<", $high) 
    )) 
) 

От cts:element-range-query documentation:

Если вы хотите ограничить на диапазон значений, вы можете объединить несколько конструкторов cts: element-range-query вместе с cts: and-query или любыми другими составными конструкторами cts: query, как в последней части приведенного ниже примера.

+0

Проблема здесь в значении «2015-02» является динамичной. Поэтому я думаю, 'start-with' или замена индекса диапазона на Date from ** dateTime ** на строку –

+0

Я отредактировал код выше, чтобы показать более динамичный подход –

+0

Хех. Я понял, что отвечаю на поиск, когда вы спрашиваете о значениях.Вы можете использовать параметр $ start для cts: values ​​(), чтобы перейти к правой части лексики, использовать «limit = 31», чтобы ограничить количество возвращающихся, а затем проверить, что вы получаете. Хм, может быть, стоит отдельный ответ. –

Смежные вопросы