在 OS X 上使用 4.2-6 对我来说也很奇怪。这是我使用完整的 oscars 数据集在测试中的结果。
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";
let $options :=
<options xmlns="http://marklogic.com/appservices/search">
<default-suggestion-source>
<range type="xs:string">
<element ns="http://marklogic.com/wikipedia" name="name" />
</range>
</default-suggestion-source>
</options>
return search:suggest("Robert Lo", $options)
=>
Robert "Loretta Young"
Robert "Lorraine Bracco"
Robert "Lotte Lenya"
Robert "Louis Calhern"
Robert "Louis Gossett, Jr."
Robert "Louis Malle"
Robert "Louise Fletcher"
看起来这些值是为 or-query(('Robert', 'Lo')) 生成的,然后以一种奇怪的方式合并。如果我们使用 cts lexicon 函数,事情看起来很正常。
cts:element-value-match(
QName('http://marklogic.com/wikipedia', 'name'),
'Robert Lo*')
=>
Robert Loggia
单词交换方面使事情变得更加复杂,并且超出了自动建议通常所做的范围(以及在没有帮助的情况下可以做什么search:suggest
)cts:element-value-match
。
这是一个版本,它使用额外的字符串操作来创建两个模式,处理成对的单词。它假定第一个单词总是完整的,而第二个单词可能是一个存根,但可能需要交换这些单词以进行匹配。如果您定义了所需的逻辑,您应该能够对其进行修改以满足您的要求。请注意,函数映射正在发挥作用,因此cts:element-value-match
在评估期间每个模式调用一次。这可能会对性能产生影响。
let $toks := cts:tokenize($INPUT)[. instance of cts:word]
let $pat := (
if (count($toks) eq 1) then concat($toks, '*')
else (
concat($toks[2], '* ', $toks[1]),
concat($toks[1], ' ', $toks[2], '*')))
return cts:element-value-match(
QName('http://marklogic.com/wikipedia', 'name'),
$pat)
=>
Robert Loggia