我有以下xml结构:
<root>
<text>Hi i am a test user and doing testing here. Copied text Let’s suppose we have a text field where the user needs to enter the number of a person id. If the user types 1, all ids starting with 1 will show up. If the user types 12, all ids starting with 12 will show up.</text>
</root>
现在我在“text”元素上创建了字段,并在其上启用了字段词汇。执行以下查询:
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>
<word collation="http://marklogic.com/collation//S2">
<field name="text"/>
</word>
</default-suggestion-source>
</search:options>
return
search:suggest("tes", $options, 100)
结果我得到了“测试”和“tseting”作为绝对正确的建议,但我也想要更多的文字,如上面的情况我期待“测试用户和做......”和“在这里测试.. “。请帮帮我。
答案 0 :(得分:1)
单词词典存储单词代币,这就是为什么你要返回单个单词而不是短语。对于短语内的匹配,您可以使用<text>
上的范围索引,并为每个搜索建议条目concat('*',$term,'*')
,以便您的API调用看起来像search:suggest("*tes*", $options, 100)
。
但是,由于领先的通配符模式,我认为这将大大减慢您的查询速度,并且它还将返回元素的整个值,而不是从搜索词的位置开始,即:{{1}不是Hi i am a test user and doing testing here. Copied text ...
。当然,你可以通过编程方式解析它。
为了获得更好的性能,请考虑使用分块元素范围索引策略。它需要预处理和潜在的大量数据,具体取决于块源的大小,但它将实现您想要的结果,并且非常快速和可扩展。有一个excellent blog post over at Avalon consulting,详细说明了如何执行此操作。
答案 1 :(得分:1)
要搜索部分短语,请使用开头双引号(语法值),而不使用结束引号。 例如:search:suggest('“and th',$ options) “然后” “还有这个” 结束双引号表示解析器该短语是完整的 因此,不会生成扩展建议。 也用于约束。
search:suggest('constraint:"and th', $options)</search:quotation>