是否可以索引子元素?
我的数据设置如下
<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
我正在使用搜索:搜索来查询这些项目,但搜索结果/@total
是计划的数量,而不是计划项目的数量。
我还发现当我执行xdmp:estimate(/schedule/scheduleItem)
时,它会返回计划的数量,而不是scheduleItem的数量。
fn:count()
会返回正确的数字,但如果速度很慢而且没有使用索引,我想要清除fn:count()
。
有没有办法使用xdmp:estimate()
或search:search()
获取scheduleItem的数量?
我正在调查Field Range Indexes
答案 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!