Marklogic 索引子项

Marklogic index children

是否可以对子元素进行索引?

我的数据是这样设置的

    <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

的所有 scheduleItems 的计数

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

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

fn:count() returns 正确的数字但是,如果它很慢并且不使用索引,我想远离 fn:count()

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

我正在研究字段范围索引

MarkLogic 默认索引所有元素。这里的问题是您将文档视为 table。文档更像行。我建议为每个 scheduleItem 元素创建一个文档。时间表可以是一个 URI 前缀,创建一个像 "/schedules/"||$id||"/" 这样的虚拟目录。平均 430-B 的文档会有点小,但大小没有设计文档结构以匹配您的应用程序那么重要。

您还可以考虑 scheduleItem 上的片段根。但从长远来看 运行 我认为你最好使用多个文档。

我也建议拆分文档,但如果您愿意创建范围索引,您也许可以这样做:

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,或者按照 Michael 的建议应用片段根,那将包括误报。

HTH!