在Marklogic中对typeahead应用建议源约束

时间:2013-10-18 12:28:12

标签: xquery autosuggest marklogic

说,我有5个属于不同集合的文档,例如:

Biography, Fiction, Humour, Adventure 

例如,文档1位于冒险集合中:

<Book>
<title>Harry Potter and the Deathly Hallows</title>
<Author>J.K.Rowling</Author>
<year>2007</year>
</Book>

文件2,在传记收藏:

<Book>
<title>Steve Jobs</title>
<Author>Walter Issacson</Author>
<year>2011</year>
</Book>

现在我想在year元素上应用建议。我想将它应用于集合,例如 - 传记集合上的建议 我在year上定义了元素范围索引,并使用应用程序加载器和文档设置中文档的已配置集合来提取样本文档。

Follwing是我的XQUERY代码:

xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search"
    at "/MarkLogic/appservices/search/search.xqy";

let $options := 
<options xmlns="http://marklogic.com/appservices/search">
 <constraint name="Group">
    <collection prefix="Biography/"/>
 </constraint>

 <suggestion-source ref="Group">
   <range collation="http://marklogic.com/collation/" 
          type="xs:string" >
      <element name="year"/>
   </range>
 </suggestion-source>
 </options>
return    
search:suggest("Group:20", $options)  

在运行此查询时,我收到 2011 2007 的建议,这不是我所期待的。 预期建议为 2011 (因为只应搜索Biography个集合)。 我在搜索中提到this doc:建议但是我无法找出究竟是什么错误。 我在哪里做错了?

2 个答案:

答案 0 :(得分:3)

Shrey:

建议源中的值将替换引用约束中的值。换句话说,选项表明由组约束限定的输入应来自年份范围索引,这就是您所看到的。有关详细信息,请参阅:

http://docs.marklogic.com/guide/search-dev/search-api#id_40748

要过滤一组建议,您可以使用两个字符串查询调用search:suggest()。第一个提供建议的输入。第二个提供过滤约束。在上面的例子中,过滤约束将是传记集合。有关详细信息,请参阅:

http://docs.marklogic.com/guide/search-dev/search-api#id_91911

希望有帮助

答案 1 :(得分:0)

但是,我可以在选项中使用additional-query来实现所需的输出,如下所示:

xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy"; 
let $options := 
    <options xmlns="http://marklogic.com/appservices/search">
        <additional-query>{cts:collection-query("Biography")}
        </additional-query>
        <constraint name="Search_Element">
          <range collation="http://marklogic.com/collation/" 
           type="xs:string" >
            <element name="year"/>
          </range>
        </constraint> 
        <suggestion-source ref="Search_Element">
          <range collation="http://marklogic.com/collation/" 
          type="xs:string" >
          <element name="year"/>
          </range>
        </suggestion-source>
    </options>
return    
search:suggest("Search_Element:20", $options)

尽管如此,我还是想知道如何在不使用额外查询参数的情况下完成它,因为在上面使用集合约束会更加优化。