gpt4 book ai didi

xquery - 为什么我的 Optic API 查询的结果不是我在排序和过滤时所期望的?

转载 作者:行者123 更新时间:2023-12-04 03:56:24 27 4
gpt4 key购买 nike

我想要完成的事情:
我目前正在开发一个 xquery 脚本,以 html 表的形式检索 marklogic 数据库的数据,并可以对每一列进行排序和过滤。
数据作为具有外键的不同文档分布在多个目录中,就像关系数据库保存数据一样。
现在这可能不是最佳解决方案,但遗憾的是我现在无法改变它。
有什么问题:
第一个解决方案是通过主目录 (smlaws) 上的 cts:search,它带有对所有元素进行过滤和排序的选项,并且效果很好。但是这些文档中不存在某些信息,因此我不得不进行多个其他查询以检索所有必要的数据,然后进行排序和过滤。
这适用于一些记录,但不适用于 40.000。
好吧,我现在正在尝试使用 TDE 和 marklogic 的光学 API 找到解决方案。
起初这看起来很棒,但是一旦我开始过滤和排序,我就没有得到预期的结果。
结果太随机了,我不明白这是怎么回事。
直接在文档插入后找到所有记录。几分钟后,他们不再是了。
如果我按列排序,我仍然会得到所有预期的结果。如果我然后按该列再次订购,但降序,我得到零结果。
这种行为似乎随机改变。
我检查了 marklogic 是否完成了索引。
我为每个过滤/排序的列创建了一个元素范围索引。

    {
"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", "fksfstatus"), 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"),
op:view-col("smlaws", "fksmlawareas"),
op:view-col("smlaws", "identifier"),
op:view-col("sfpublicationchannels", "fksfstatus"),
op:view-col("sfstatus", "pksfstatus"),
op:view-col("sfstatus", "identifier"),
op:view-col("smlawareas", "pksmlawareas"),
op:view-col("smlawareas", "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,...) 我没有得到正确的结果?
  • 对于我要完成的工作,是否有更好的解决方案?
  • 有没有更好的方法来执行类似条件?
  • 最佳答案

    对于结果集的可变性,最好的步骤可能是提出支持票以开始调查。
    对于用户提供的过滤条件,请考虑

    op:where(op:sql-condition(...criteria...))
    如此处所述: https://docs.marklogic.com/op:sql-condition
    如果过滤条件可以在某些连接之前应用,
    通过以下操作序列,查询可能会执行得更好:
  • 根据需要加入过滤器
  • 应用过滤器
  • 按过滤行排序
  • 对有序行的限制
  • 完成其余的连接
  • 订购最终输出

  • 通过加入较小的数据集,可以减少工作量。如果用于过滤的列可以非规范化到 smlaws View 的源文档中,那么过滤可以在任何联接之前发生,这将最大限度地减少联接的数量。
    希望有所帮助,

    关于xquery - 为什么我的 Optic API 查询的结果不是我在排序和过滤时所期望的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63806831/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com