如果某些文档具有空值元素,则在日期字段上使用元素范围查询进行搜索
Search with element-range-query on date field if some of the documents have empty-value elements
我在 modificationDateTime
元素上创建了一个元素范围索引。
我们的xml是这样的:
<data>
<id>456789</id>
<modificationDateTime>2018-10-15T15:16:37.047Z</modificationDateTime>
<otherElementsFollow> ... </otherElementsFollow>
</data>
我正在使用以下查询来获取 15th Oct 2018
甚至第 15 到 16 范围内的文档:
cts:search(/, (
cts:and-query((
cts:directory-query("/my-directory/", "1")
, cts:element-range-query(xs:QName("modificationDateTime"), ">=", xs:dateTime("2018-10-15T00:00:00.000+05:30"))
, cts:element-range-query(xs:QName("modificationDateTime"), "<=", xs:dateTime("2018-10-15T23:59:59.000+05:30"))
))
)
当我 运行 查询时出现以下错误:
[1.0-ml] XDMP-CAST: (err:FORG0001) cts:search(fn:collection(), cts:and-query((cts:directory-query("/my-directory/", "1"), cts:element-range-query(xs:QName("modificationDateTime"), ">=", xs:dateTime("2018-10-15T00:00:00+05:30"), (), 1), cts:element-range-query(xs:QName("modificationDateTime"), "<=", xs:dateTime("2018-10-15T23:59:59+05:30"), (), 1)), ())) -- Invalid cast: "" cast as xs:dateTime
经过一些分析,我发现有些 XML 的 <modificationDateTime>
元素值为空,例如:
<data>
<id>1234567</id>
<modificationDateTime></modificationDateTime>
<otherElementsFollow> ... </otherElementsFollow>
</data>
所以这就是导致这个问题的原因,我们不能删除这个元素,我们也不能有一些值,因为空是一个有效值。
关于如何在空元素上使用范围索引进行搜索的任何帮助,理想情况下它应该考虑这些记录,但是当我将空值更新为有效的 dateTime 值时,相同的查询可以正常工作。
如果排除包含这些空元素的文档是一个选项,您可以将此非查询附加到您的和查询中以执行此操作:
cts:not-query(
cts:element-value-query(xs:QName("modificationDateTime"), "")
)
HTH!
我在 modificationDateTime
元素上创建了一个元素范围索引。
我们的xml是这样的:
<data>
<id>456789</id>
<modificationDateTime>2018-10-15T15:16:37.047Z</modificationDateTime>
<otherElementsFollow> ... </otherElementsFollow>
</data>
我正在使用以下查询来获取 15th Oct 2018
甚至第 15 到 16 范围内的文档:
cts:search(/, (
cts:and-query((
cts:directory-query("/my-directory/", "1")
, cts:element-range-query(xs:QName("modificationDateTime"), ">=", xs:dateTime("2018-10-15T00:00:00.000+05:30"))
, cts:element-range-query(xs:QName("modificationDateTime"), "<=", xs:dateTime("2018-10-15T23:59:59.000+05:30"))
))
)
当我 运行 查询时出现以下错误:
[1.0-ml] XDMP-CAST: (err:FORG0001) cts:search(fn:collection(), cts:and-query((cts:directory-query("/my-directory/", "1"), cts:element-range-query(xs:QName("modificationDateTime"), ">=", xs:dateTime("2018-10-15T00:00:00+05:30"), (), 1), cts:element-range-query(xs:QName("modificationDateTime"), "<=", xs:dateTime("2018-10-15T23:59:59+05:30"), (), 1)), ())) -- Invalid cast: "" cast as xs:dateTime
经过一些分析,我发现有些 XML 的 <modificationDateTime>
元素值为空,例如:
<data>
<id>1234567</id>
<modificationDateTime></modificationDateTime>
<otherElementsFollow> ... </otherElementsFollow>
</data>
所以这就是导致这个问题的原因,我们不能删除这个元素,我们也不能有一些值,因为空是一个有效值。
关于如何在空元素上使用范围索引进行搜索的任何帮助,理想情况下它应该考虑这些记录,但是当我将空值更新为有效的 dateTime 值时,相同的查询可以正常工作。
如果排除包含这些空元素的文档是一个选项,您可以将此非查询附加到您的和查询中以执行此操作:
cts:not-query(
cts:element-value-query(xs:QName("modificationDateTime"), "")
)
HTH!