问题描述
我要完成的工作:
我目前正在研究xquery脚本,以html表的形式检索marklogic数据库的数据,并可以对每列进行排序和过滤。 数据分布在多个目录中,就像带有关系键的不同文档一样,关系数据库将保存数据。 现在这可能不是最佳解决方案,但遗憾的是我暂时无法更改它。
出了什么问题?
第一个解决方案是通过主目录(smlaws)上的cts:search进行的,该目录带有对所有元素进行过滤和排序的选项,并且效果很好。但是这些文档中不存在某些信息,因此我不得不进行多个其他查询来检索所有必需的数据,然后进行排序和过滤。 仅有几条记录就可以了,但不能达到40.000。
好吧,我现在正在尝试使用TDE和marklogic的光学API找到解决方案。 乍一看,这看起来很棒,但是当我开始过滤和排序后,我并没有得到预期的结果。
结果是如此随机,我不知道发生了什么。 在文档插入之后立即找到所有记录。几分钟后,它们不再存在。 如果按列排序,我仍会获得所有预期结果。如果然后再按该列排序但降序,则得到零结果。 这种行为似乎是随机变化的。
我检查了marklogic是否完成了索引编制。
我为每个过滤/排序的列创建了一个element-range-index。
{
"localname": "identifier","scalar-type": "string","namespace-uri": "","collation": "http://marklogic.com/collation/en/S1","range-value-positions": false,"invalid-values": "ignore"
}
我也想找到一种执行类似条件的更好方法。 该脚本主要是动态的,这意味着对于当前的解决方案,如果用户输入(过滤器)可以使用,我必须检查一下自己。 使用cts:element-word-query进行过滤的效果更好,但是结果未过滤,这可能是缺少索引的问题,但是我不确定是否需要额外的索引。
简化的xquery脚本:
xquery version "1.0-ml";
import module namespace op = "http://marklogic.com/optic" at "/MarkLogic/optic.xqy";
let $smlawsview := op:from-view("main","smlaws")
let $sfpublicationchannelsview := op:from-view("main","sfpublicationchannels")
let $sfstatusview := op:from-view("main","sfstatus")
let $smlawareasview := op:from-view("main","smlawareas")
let $maps := $smlawsview
let $maps := op:where($maps,op:sql-condition(fn:concat("smlaws.identifier LIKE '%identifier%'")))
let $maps := op:join-inner($maps,$sfpublicationchannelsview,op:on("fksfpublicationchannels",op:view-col("sfpublicationchannels","pksfpublicationchannels")))
let $maps := op:where($maps,op:eq(op:view-col("sfpublicationchannels","fksfstatus"),"1"))
let $maps := op:join-inner($maps,$sfstatusview,op:on(op:view-col("sfpublicationchannels",op:view-col("sfstatus","pksfstatus")))
let $maps := op:join-inner($maps,$smlawareasview,op:on(op:view-col("smlaws","fksmlawareas"),op:view-col("smlawareas","pksmlawareas")))
let $maps := op:select($maps,(
op:view-col("smlaws","pksmlaws"),op:view-col("smlaws","fksfpublicationchannels"),"identifier"),"pksfstatus"),"pksmlawareas"),"identifier")
))
let $maps := op:order-by($maps,op:asc(op:view-col("smlaws","identifier")))
let $maps := op:offset-limit($maps,op:param("offset"),op:param("limit"))
let $maps := op:result($maps,(),map:entry("offset",0)
=> map:with("limit",10)
)
return for $map in $maps
return element row {
element id {map:get($map,"main.smlaws.pksmlaws")},element fksfpublicationchannels {map:get($map,"main.smlaws.fksfpublicationchannels")},element identifier {map:get($map,"main.smlaws.identifier")},element status {map:get($map,"main.sfstatus.pksfstatus")},element fksfstatus {map:get($map,"main.sfstatus.identifier")},element lawarea {map:get($map,"main.smlawareas.pksmlawareas")},element fksmlawareas {map:get($map,"main.smlawareas.identifier")}
}
示例文档:
<smlaws>
<id>1</id>
<identifier>law 1</identifier>
<fksfpublicationchannels>1</fksfpublicationchannels>
<fksmlawareas>1</fksmlawareas>
</smlaws>
<sfpublicationchannels>
<id>1</id>
<identifier>publicationchannel 1</identifier>
<fksfstatus>1</fksfstatus>
</sfpublicationchannels>
<sfstatus>
<id>1</id>
<identifier>status 1</identifier>
</sfstatus>
<smlawareas>
<id>1</id>
<identifier>lawarea 1</identifier>
</smlawareas>
smlaws的示例:
<tde:template xmlns:tde='http://marklogic.com/xdmp/tde' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://marklogic.com/xdmp/tde '>
<tde:description>TDE view for smlaws</tde:description>
<tde:context>/envelope/instance/smlaws</tde:context>
<tde:enabled>true</tde:enabled>
<tde:rows>
<tde:row>
<tde:schema-name>main</tde:schema-name>
<tde:view-name>smlaws</tde:view-name>
<tde:columns>
<tde:column>
<tde:name>pksmlaws</tde:name>
<tde:scalar-type>int</tde:scalar-type>
<tde:val>id</tde:val>
<tde:nullable>false</tde:nullable>
<tde:collation>http://marklogic.com/collation/en/S1</tde:collation>
</tde:column>
<tde:column>
<tde:name>fksmlawareas</tde:name>
<tde:scalar-type>int</tde:scalar-type>
<tde:val>fksmlawareas</tde:val>
<tde:nullable>true</tde:nullable>
<tde:collation>http://marklogic.com/collation/en/S1</tde:collation>
</tde:column>
<tde:column>
<tde:name>identifier</tde:name>
<tde:scalar-type>string</tde:scalar-type>
<tde:val>identifier</tde:val>
<tde:nullable>true</tde:nullable>
<tde:collation>http://marklogic.com/collation/en/S1</tde:collation>
</tde:column>
<tde:column>
<tde:name>fksfpublicationchannels</tde:name>
<tde:scalar-type>int</tde:scalar-type>
<tde:val>fksfpublicationchannels</tde:val>
<tde:nullable>false</tde:nullable>
<tde:collation>http://marklogic.com/collation/en/S1</tde:collation>
</tde:column>
</tde:columns>
</tde:row>
</tde:rows>
</tde:template>
问题:
- 如何确定我的设置中有什么问题(无论是指示,还是tde 或xquery,...)我没有得到正确的结果?
- 我要完成的工作是否有更好的解决方案?
- 有没有更好的方法来执行类似条件?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)