cts:field-word-query 问题
Issue with cts:field-word-query
我在我的 MarkLogic 数据库(例如 ABC)中基于元素 XPath 创建了一个名为 'publication-titles' 的字段。
以下查询在以内容源作为数据库的 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">
任何人都可以帮助我了解这里出了什么问题吗?
(替换答案)
看来您遇到了一个不幸的错误,该错误似乎适用于所有 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!
某些查询构造函数依赖于执行上下文。字段查询和范围或地理空间查询具有最明显的依赖性(索引是否存在?它的参数是什么?),但值和单词查询也会查看配置以确定它们是否对位置敏感或是否启用。当您将构造函数放在调用函数之外时,它将在外部配置中被调用。通常这不会产生 material 差异,但在许多情况下会产生差异,或者会产生细微差异(例如,在应该使用位置时未能使用)。没有办法按照您喜欢的方式进行这项工作,就像我们无法调用 xdmp:database()
在这种情况下工作一样。
如果您只是在函数体内执行相同的调用(即只需将相同的 let/return 放在那里),事情应该会起作用。错误在于这也不起作用,因为构造函数错误地认为可以通过外部上下文在优化阶段执行它们的方式来优化它们。我会在 50017 下解决这个问题。
我在我的 MarkLogic 数据库(例如 ABC)中基于元素 XPath 创建了一个名为 'publication-titles' 的字段。
以下查询在以内容源作为数据库的 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">
任何人都可以帮助我了解这里出了什么问题吗?
(替换答案)
看来您遇到了一个不幸的错误,该错误似乎适用于所有 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!
某些查询构造函数依赖于执行上下文。字段查询和范围或地理空间查询具有最明显的依赖性(索引是否存在?它的参数是什么?),但值和单词查询也会查看配置以确定它们是否对位置敏感或是否启用。当您将构造函数放在调用函数之外时,它将在外部配置中被调用。通常这不会产生 material 差异,但在许多情况下会产生差异,或者会产生细微差异(例如,在应该使用位置时未能使用)。没有办法按照您喜欢的方式进行这项工作,就像我们无法调用 xdmp:database()
在这种情况下工作一样。
如果您只是在函数体内执行相同的调用(即只需将相同的 let/return 放在那里),事情应该会起作用。错误在于这也不起作用,因为构造函数错误地认为可以通过外部上下文在优化阶段执行它们的方式来优化它们。我会在 50017 下解决这个问题。