Marklogic索引儿童

时间:2015-02-20 21:47:30

标签: xml indexing xquery marklogic

是否可以索引子元素?

我的数据设置如下

    <schedule id="ID_HERE" lang="LANGUAGE">
    <scheduleItem id="CHILD_NODE_ID" lang="eng">
        <dateTime>
            2015-01-19T00:00:09-00:00
        </dateTime>
    </scheduleItem>
    <scheduleItem id="CHILD_NODE_ID1" lang="eng">
        <dateTime>
            2015-01-19T00:00:09-00:00
        </dateTime>
    </scheduleItem>
    <scheduleItem id="CHILD_NODE_ID2" lang="eng">
        <dateTime>
            2015-01-19T00:00:09-00:00
        </dateTime>
    </scheduleItem>
</schedule>

我的数据库中有多个计划。

我正在尝试获取符合搜索结果的scheduleItems的数量 - 例如:包含/@lang = eng/dateTime < 2015-01-19T00:00:00

的所有scheduleItem的计数

我正在使用搜索:搜索来查询这些项目,但搜索结果/@total是计划的数量,而不是计划项目的数量。

我还发现当我执行xdmp:estimate(/schedule/scheduleItem)时,它会返回计划的数量,而不是scheduleItem的数量。

fn:count()会返回正确的数字,但如果速度很慢而且没有使用索引,我想要清除fn:count()

有没有办法使用xdmp:estimate()search:search()获取scheduleItem的数量?

我正在调查Field Range Indexes

2 个答案:

答案 0 :(得分:4)

MarkLogic默认为所有元素编制索引。这里的问题是你正在处理像表格一样的文档。文档更像行。我建议每个scheduleItem元素创建一个文档。计划可以是URI前缀,创建像"/schedules/"||$id||"/"这样的虚拟目录。平均430-B的文档会有点小,但是大小不如设计文档结构那么重要,以便它与您的应用程序匹配。

您还可以考虑scheduleItem上的片段根。但从长远来看,我认为你会有更多的文件。

答案 1 :(得分:2)

我还建议拆分文档,但是如果你愿意创建一个范围索引,你可能会做这样的事情:

fn:sum(
  for $v in cts:element-attribute-values(
    xs:QName('scheduleItem'),
    xs:QName('lang'),
    (),
    "item-frequency"
  )
  return cts:frequency($v)
)

这将从范围索引的值词典中提取所有唯一值,从索引中获取所有值,并且只需要在运行时执行求和以查找总数。

cts:* - values函数还需要一个额外的参数来限制例如包含特定日期范围内的scheduleItems的计划。如果您不将文档拆分为单独的scheduleItems,或者按照迈克尔的建议应用片段根,那么这将包括误报。

HTH!