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 整个结果集。

  1. 您上面的代码中存在基本语法错误:缺少括号、多余的双引号
  2. 我认为您不希望将单词查询作为“=”的翻译;单词查询只是说单词出现在相关字段中的某个地方;我认为那将是一个值查询。
  3. 您可能想看一下 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"))
  ))
))

这是一个非常直接的映射。