Marklogic cts问题:字段词查询

Marklogic cts问题:字段词查询,marklogic,marklogic-8,Marklogic,Marklogic 8,我在基于元素XPath的MarkLogic数据库(比如ABC)中创建了一个名为“publication titles”的字段 以下查询适用于内容源为数据库“ABC”(其中存在字段)的QC let$text:='The Point' let$query:=cts:字段词查询(“出版物标题”、$text、, (“区分标点符号”、“不区分大小写”、“区分空白”),5.0) 返回 xdmp:调用函数(函数() { cts:搜索(/Publication,$query)[1] }, {xdmp:数据库(“

我在基于元素XPath的MarkLogic数据库(比如ABC)中创建了一个名为“publication titles”的字段

以下查询适用于内容源为数据库“ABC”(其中存在字段)的QC

let$text:='The Point'
let$query:=cts:字段词查询(“出版物标题”、$text、,
(“区分标点符号”、“不区分大小写”、“区分空白”),5.0)
返回
xdmp:调用函数(函数()
{
cts:搜索(/Publication,$query)[1]
},
{xdmp:数据库(“ABC”)}
)
但是,如果将内容源更改为任何其他数据库,则会出现以下错误

[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">
[1.0-ml]XDMP-NOFIELD:cts:search(fn:collection()/Publication,cts:field-
单词查询(“出版物标题”、“要点”(“案例-
不敏感“,”标点符号敏感“,”空格敏感“,”lang=en“,”5)-
-未定义字段:出版物标题
堆栈跟踪
在第8行第8列:
在函数()中作为项()*()
6.xdmp:调用函数(函数()
7. {
8.cts:search(/Publication,$query)[1]
9. },
10
有人能帮我理解这里出了什么问题吗?

(替换答案)

看起来您遇到了一个不幸的错误,它似乎适用于所有
cts:field-*-query
query构造函数,但不适用于任何其他构造函数(未完全验证)

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

同时,最好强制执行查询构造函数以在内部上下文中重新计算。可以通过将查询序列化为XML并在内联函数中对其进行解析来实现这一点。这相当容易。使用
文档{..}/*
包装构造函数,并使用
cts:query($query)

let$text:='The Point'
let$query:=文档{
cts:字段词查询(“出版物标题”,$text,
(“区分标点符号”、“不区分大小写”、“区分空白”),5.0)
}/*
返回
xdmp:调用函数(函数()
{
cts:search(/Publication,cts:query($query))[1]
},
{xdmp:数据库(“ABC”)}
)
序列化和解析的代价很小,但与实际搜索时间相比,这可能可以忽略不计


HTH!

某些查询构造函数依赖于执行上下文。字段查询和范围或地理空间查询具有最明显的依赖性(索引是否存在?其参数是什么?),但值查询和词查询也会查看配置,以确定它们是位置敏感的还是已启用的。当您将构造函数置于调用函数之外时,它将在外部配置中调用。这通常不会产生实质性的差异,但在许多情况下会产生,或者会产生细微的差异(例如,未能在您应该使用的时候使用positions)。没有办法按照您希望的方式进行此操作,正如我们无法在该上下文中调用
xdmp:database()
工作一样


如果您只是在函数体中执行相同的调用(即,在函数体中放置相同的let/return),那么事情应该可以正常工作。错误是,这也不起作用,因为构造函数错误地认为可以通过外部上下文在优化阶段执行它们的方式对它们进行优化。我将在50017下对此进行修复。

grtjn,我知道。请注意,我使用xdmp:invoke-function()显式地对“ABC”数据库执行此查询。我只是通过查询控制台中的Content Source选项更改数据库。此外,无论我是在xdmp:invoke-function()内部还是外部构建cts:field word查询,都没有关系,我仍然得到相同的错误。顺便说一句,我使用的是ML版本8.0-3.Ah,忽略了xdmp:invoke函数,在本地得到相同的结果。让我在内部询问一下。一位同事确认,这似乎发生在cts:field-*-query上,但没有发生在例如cts:element-range-query上。听起来你发现了一个错误。我确认这不是一个错误现在我不能使用CTS:FELLD-Word-QuySQL(),我不知道如何使用CTS:EntEngE-Word-QuySQL()来考虑特殊字符($,γ,@,and,E.TC)作为单词。我用TKEngisher覆盖了我的字段,将这些字符作为单词。你能想到任何其他方法来搜索XML元素中的特殊字符吗?
[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">
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>
  )