我正在尝试使用 search:suggest 功能,在实验过程中出现了一些问题。
所以我有一个包含 10 个文档的数据库,其中仅包含一个属性:
{
"title": "Do Androids Dream of Electric Sheep?"
}
在我的查询控制台中,我有文档中的代码示例
xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";
let $options :=
<search:options xmlns="http://marklogic.com/appservices/search">
<default-suggestion-source>
<range collation="http://marklogic.com/collation/"
type="xs:string" facet="true">
<element ns="" name="title"/>
</range>
</default-suggestion-source>
</search:options>
return
因此出现了一些我无法根据 marklogic 文档得到解释的问题:
为什么当我尝试使用
search:suggest("of", $options)
搜索时,我得到 0 个结果,但 search:suggest("*of", $options)
返回一些内容。 (结果:“仿生人会梦见电子羊吗?”、“深夜小狗离奇事件”、“生命中不能承受之轻”)为什么开头的通配符有帮助?
我有一份文件,标题为:“夜间狗的好奇事件”,我以为
search:suggest("Curious", $options)
会归还我这份文件,但它没有发生。在单词末尾或开头添加空格会有所帮助 (search:suggest("Curious ", $options)
。这是为什么?为什么这些空间有帮助?
您的搜索选项指定
range
作为建议源,因此它将使用 title 元素范围索引词典作为源。
该 title 元素的词典值是该元素的完整字符串值。您可以看到词典值是什么:
cts:element-values(xs:QName("title"), "", (), cts:true-query())
包含选项的
search:suggest()
相当于执行带有尾随通配符的 cts:element-value-match()
。 search:suggest
将“自动神奇地”将 *
附加到指定的第一个字符串值的末尾,并查找以该值开头的词典值。
所以,当你执行时:
search:suggest(("of"), $options)
它大致相当于:
cts:element-value-match(xs:QName("title"), "of*")
当你执行时:
search:suggest(("*of"), $options)
那么它大致相当于:
cts:element-value-match(xs:QName("title"), "*of*")
对于带有前导空格或尾随空格的“Curious”的第二个查询,它最终会应用“Curious”的
cts:word-query()
。同样,如果您指定了“Dog Curious”(请注意 Dog AND Curious 后面的尾随空格),那么它将在 cts:word-query
中应用两个 cts:and-query()
。
您可以通过启用诊断跟踪事件并应用“MarkLogic.DEBUG”跟踪事件来了解实现正在做什么以及它产生什么。启用该跟踪事件后,INFO 级别消息将写入应用程序服务器的
<portNumber>_ErrorLog.txt
。您可以使用该信息更好地了解如何解析和使用您的 search:suggest()
$qtext
参数值。