Oracle Marklogic如何构造cts查询
我有一个Oracle查询,希望转换为Marklogic cts查询。看起来Marklogic CTS不允许在and query中包含and query。我不确定Marklogic是如何工作的。提前谢谢 Where子句查询:Oracle Marklogic如何构造cts查询,oracle,marklogic,Oracle,Marklogic,我有一个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
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)
您的代码中有几个拼写错误。集合查询中有一个额外的双引号,并且在最后一个or查询中的项之间缺少逗号 一旦修复了这些问题,代码将运行。但是一个专业提示:永远不要只为了获取文档而获取URI。你在浪费精力。只需通过一个通过查询的搜索直接获取文档
let $q := cts:and-query((...))
return cts:search(doc(), $q)[1 to 10]
除非您真的打算返回完整的结果集,否则您可能还想添加一个类似于[1到10]的限制。您的代码中有几个输入错误。集合查询中有一个额外的双引号,并且在最后一个or查询中的项之间缺少逗号 一旦修复了这些问题,代码将运行。但是一个专业提示:永远不要只为了获取文档而获取URI。你在浪费精力。只需通过一个通过查询的搜索直接获取文档
let $q := cts:and-query((...))
return cts:search(doc(), $q)[1 to 10]
您可能还想添加一个类似于[1到10]的限制,除非您真的打算返回完整的结果集
上面的代码中有一些基本语法错误:缺少paren,额外的双引号
我认为您不希望word query作为=;单词查询只是说单词出现在相关字段的某个地方;我认为这应该是一个值查询。
您可能想看看cts:parse,它接受带有and和ORs等的字符串以及字段绑定,并将查询字符串解析为cts:query
也就是说,如果您假设AND与ORs混合后绑定到最近的子句,即如括号中所示:
(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"))
))
))
这是一个相当直接的映射
上面的代码中有一些基本语法错误:缺少paren,额外的双引号
我认为您不希望word query作为=;单词查询只是说单词出现在相关字段的某个地方;我认为这应该是一个值查询。
您可能想看看cts:parse,它接受带有and和ORs等的字符串以及字段绑定,并将查询字符串解析为cts:query
也就是说,如果您假设AND与ORs混合后绑定到最近的子句,即如括号中所示:
(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"))
))
))
这是一个非常直接的映射。谢谢。现在我了解了如何构造marklogic查询。谢谢。现在我了解了如何构造marklogic查询。