Marklogic如何构造cts查询
Marklogic how to construct a cts query
我有一个 Oracle 查询,想转换成 Marklogic cts 查询。看起来 Marklogic CTS 不允许在 "and-query" 中包含 "and-query"。我不确定 Marklogic 是如何工作的。提前致谢。
Where 子句查询:
where (collection = "TRBA" AND fulltext = 1
AND (dnta = "Briefing" OR dnta = "Conference" OR snta = "Workshop"
OR snta = "Published in" AND (snta = "this article" OR dnta = "Journal")
)
AND (cand IN ("Research","Development Center") OR scn IN("424778","98814","393825"))
翻译成 Marklogic:
let $uris:= cts:uris(
(),
(),
cts:and-query((
cts:collection-query("/dbs/"TRBA"),
cts:element-value-query(xs:QName("meta:FullTextExists"),"1"),
cts:field-word-query("dnta",("briefing","conference")),
cts:or-query((
cts:element-word-query(xs:QName("meta:snta"),("this article")),
cts:field-word-query("dnta",("Journal")),
cts:and-query((
cts:or-query((
cts:field-word-query("cand", ("Research","Development Center"))
cts:field-word-query("scn",("424778","98814","393825"))
))
))(:inside and-query:)
))(:or-query:)
))(:outside and-query:)
return fn:doc($uris)
您的代码中有几个拼写错误。 collection-query
中有一个额外的双引号,最后一个 or-query
.
中的项目之间缺少逗号
修复这些问题后,代码将 运行。但有一个专业提示:永远不要只为了获取文档而获取 URI。你在浪费精力。只需通过传递查询的搜索直接获取文档。
let $q := cts:and-query((...))
return cts:search(doc(), $q)[1 to 10]
您可能还想添加一个像 [1 to 10]
这样的限制,除非您真的打算 return 整个结果集。
- 您上面的代码中存在基本语法错误:缺少括号、多余的双引号
- 我认为您不希望将单词查询作为“=”的翻译;单词查询只是说单词出现在相关字段中的某个地方;我认为那将是一个值查询。
- 您可能想看一下
cts:parse
,它采用带有 AND 和 OR 等的字符串加上字段绑定并将查询字符串解析为 cts:query
就是说,如果您假设 AND 与 OR 混合在一起绑定到最接近的子句,即如括号所示:
(collection = "TRBA" AND
fulltext = 1 AND
(dnta = "Briefing" OR
dnta = "Conference" OR
snta = "Workshop" OR
(snta = "Published in" AND (snta = "this article" OR dnta = "Journal"))
) AND
(cand IN ("Research","Development Center") OR
scn IN ("424778","98814","393825"))
那我会这样翻译:
cts:and-query((
cts:collection-query("/dbs/TRBA"),
cts:element-value-query(xs:QName("meta:FullTextExists"),"1"),
cts:or-query((
cts:field-value-query("dnta",("Briefing","Conference")),
cts:field-value-query("snta","Workshop"),
cts:and-query((
cts:field-value-query("snta","Published in"),
cts:or-query((
cts:field-value-query("snta","this article"),
cts:field-value-query("dnta","Journal")
))
))
)),
cts:or-query((
cts:field-value-query("cand",("Research","Development Center")),
cts:field-value-query("scn",("424778","98814","392825"))
))
))
这是一个非常直接的映射。
我有一个 Oracle 查询,想转换成 Marklogic cts 查询。看起来 Marklogic CTS 不允许在 "and-query" 中包含 "and-query"。我不确定 Marklogic 是如何工作的。提前致谢。
Where 子句查询:
where (collection = "TRBA" AND fulltext = 1
AND (dnta = "Briefing" OR dnta = "Conference" OR snta = "Workshop"
OR snta = "Published in" AND (snta = "this article" OR dnta = "Journal")
)
AND (cand IN ("Research","Development Center") OR scn IN("424778","98814","393825"))
翻译成 Marklogic:
let $uris:= cts:uris(
(),
(),
cts:and-query((
cts:collection-query("/dbs/"TRBA"),
cts:element-value-query(xs:QName("meta:FullTextExists"),"1"),
cts:field-word-query("dnta",("briefing","conference")),
cts:or-query((
cts:element-word-query(xs:QName("meta:snta"),("this article")),
cts:field-word-query("dnta",("Journal")),
cts:and-query((
cts:or-query((
cts:field-word-query("cand", ("Research","Development Center"))
cts:field-word-query("scn",("424778","98814","393825"))
))
))(:inside and-query:)
))(:or-query:)
))(:outside and-query:)
return fn:doc($uris)
您的代码中有几个拼写错误。 collection-query
中有一个额外的双引号,最后一个 or-query
.
修复这些问题后,代码将 运行。但有一个专业提示:永远不要只为了获取文档而获取 URI。你在浪费精力。只需通过传递查询的搜索直接获取文档。
let $q := cts:and-query((...))
return cts:search(doc(), $q)[1 to 10]
您可能还想添加一个像 [1 to 10]
这样的限制,除非您真的打算 return 整个结果集。
- 您上面的代码中存在基本语法错误:缺少括号、多余的双引号
- 我认为您不希望将单词查询作为“=”的翻译;单词查询只是说单词出现在相关字段中的某个地方;我认为那将是一个值查询。
- 您可能想看一下
cts:parse
,它采用带有 AND 和 OR 等的字符串加上字段绑定并将查询字符串解析为cts:query
就是说,如果您假设 AND 与 OR 混合在一起绑定到最接近的子句,即如括号所示:
(collection = "TRBA" AND
fulltext = 1 AND
(dnta = "Briefing" OR
dnta = "Conference" OR
snta = "Workshop" OR
(snta = "Published in" AND (snta = "this article" OR dnta = "Journal"))
) AND
(cand IN ("Research","Development Center") OR
scn IN ("424778","98814","393825"))
那我会这样翻译:
cts:and-query((
cts:collection-query("/dbs/TRBA"),
cts:element-value-query(xs:QName("meta:FullTextExists"),"1"),
cts:or-query((
cts:field-value-query("dnta",("Briefing","Conference")),
cts:field-value-query("snta","Workshop"),
cts:and-query((
cts:field-value-query("snta","Published in"),
cts:or-query((
cts:field-value-query("snta","this article"),
cts:field-value-query("dnta","Journal")
))
))
)),
cts:or-query((
cts:field-value-query("cand",("Research","Development Center")),
cts:field-value-query("scn",("424778","98814","392825"))
))
))
这是一个非常直接的映射。