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!
是否可以对子元素进行索引?
我的数据是这样设置的
<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
我正在使用 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!