为什么在进行排序和过滤时,我的Optic API查询的结果不是我期望的结果?

问题描述

我要完成的工作:

我目前正在研究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>

问题:

  1. 如何确定我的设置中有什么问题(无论是指示,还是tde 或xquery,...)我没有得到正确的结果?
  2. 我要完成的工作是否有更好的解决方案?
  3. 有没有更好的方法来执行类似条件?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)