需要解释 MarkLogic 的搜索:建议功能如何工作

问题描述 投票:0回答:1

我正在尝试使用 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 文档得到解释的问题:

  1. 为什么当我尝试使用

    search:suggest("of", $options)
    搜索时,我得到 0 个结果,但
    search:suggest("*of", $options)
    返回一些内容。 (结果:“仿生人会梦见电子羊吗?”、“深夜小狗离奇事件”、“生命中不能承受之轻”)为什么开头的通配符有帮助?

  2. 我有一份文件,标题为:“夜间狗的好奇事件”,我以为

    search:suggest("Curious", $options)
    会归还我这份文件,但它没有发生。在单词末尾或开头添加空格会有所帮助
    (search:suggest("Curious ", $options)
    。这是为什么?为什么这些空间有帮助?

xquery marklogic search-suggestion
1个回答
0
投票

您的搜索选项指定

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
参数值。

© www.soinside.com 2019 - 2024. All rights reserved.