cts问题:field-word-query

时间:2018-05-25 11:11:34

标签: marklogic marklogic-8

我创建了一个名为' publication-titles'在我的MarkLogic数据库(比如ABC)中,基于元素XPath。

以下查询适用于QC,内容来源为数据库' ABC' (在哪个领域存在)

let $text := 'The Point'

let $query := cts:field-word-query("publication-titles", $text, 
("punctuation-sensitive", "case-insensitive", "whitespace-sensitive"), 5.0)

return
  xdmp:invoke-function(function()
    {
      cts:search(/Publication, $query)[1]
    },
    <options xmlns="xdmp:eval">
      <database>{xdmp:database("ABC")}</database>
    </options>
  )

但是,如果我将内容源更改为任何其他数据库,则会出现以下错误

[1.0-ml] XDMP-NOFIELD: cts:search(fn:collection()/Publication, cts:field-    
word-query("publication-titles", "The Point", ("case- 
insensitive","punctuation-sensitive","whitespace-sensitive","lang=en"), 5)) - 
- Field not defined: publication-titles
Stack Trace
At line 8 column 8:
In function() as item()*()

6. xdmp:invoke-function(function()
7. {
8. cts:search(/Publication, $query)[1]
9. },
10. <options xmlns="xdmp:eval">

有谁能帮我理解这里出了什么问题?

2 个答案:

答案 0 :(得分:1)

(替换回答)

看起来你遇到了一个似乎适用于所有cts:field-*-query查询构造函数的不幸错误,但不适用于其他任何错误(未经过彻底验证)。

内联函数难以携带它们被调用的上下文以及它们自己的上下文,因此可以解释对错误数据库的潜在引用。应用于正确的上下文可能很棘手。我已经提交了一份错误报告,希望很快就能在下一个补丁版本中得到解决。

与此同时,最好强制执行查询构造函数以在内部上下文中重新评估。您可以通过将查询序列化为XML并在内联函数中解析它来实现。这很容易做到。使用document { .. }/*包装构造函数,并使用cts:query($query)解析它:

let $text := 'The Point'

let $query := document{
  cts:field-word-query("publication-titles", $text, 
("punctuation-sensitive", "case-insensitive", "whitespace-sensitive"), 5.0)
}/*

return
  xdmp:invoke-function(function()
    {
      cts:search(/Publication, cts:query($query))[1]
    },
    <options xmlns="xdmp:eval">
      <database>{xdmp:database("ABC")}</database>
    </options>
  )

序列化和解析有一个非常小的惩罚,但与实际搜索时间相比,这可能是微不足道的。

HTH!

答案 1 :(得分:1)

某些查询构造函数依赖于执行上下文。字段查询和范围或地理空间查询具有最明显的依赖关系(索引是否存在?它的参数是什么?),但值和字查询也会查看配置以确定它们是位置敏感还是启用。当您将构造函数放在invoke-function之外时,它将在外部配置中调用。通常这不会造成重大差异,但在许多情况下会产生实质性差异,或者它会产生微妙的差异(例如,当你应该使用时不能使用职位)。没有办法以你喜欢的方式开展这项工作,只不过我们可以在这种情况下调用xdmp:database()工作。

如果您只是在函数体内执行相同的调用(即只是将相同的let / return放在那里),事情应该有效。错误是这也不起作用,因为构造函数错误地认为它们可以在外部上下文在优化阶段执行它们的方式进行优化。我会在50017下解决这个问题。