通过使用单词词典或范围索引,我可以为一个元素设置自动完成值,如果我想搜索2个元素(firstName& lastName)并显示这2个元素的结果,该怎么办
任何想法如何在marklogic中实现相同的目标
例如
Employee1.xml
<employee>
<firstName>Sundeep</firstName>
<lastName>Kumar</lastName>
<age>Money to Nothing</age>
</employee>
Employee2.xml
<employee>
<firstName>Sunny</firstName>
<lastName>Kumar</lastName>
<age>Money to Nothing</age>
</employee>
Employee3.xml
<employee>
<firstName>Sundar</firstName>
<lastName>Kumar</lastName>
<age>Money to Nothing</age>
</employee>
Input 1 : Su
Expected Output : Sundeep Kumar
Sundar Kumar
Sunny Kumar
Input 2 : Kumar
Expected Output : Sundeep Kumar
Sundar Kumar
Sunny Kumar
答案 0 :(得分:2)
执行此操作的理想方法是在将这些文档导入数据库时将名字和姓氏元素反规范化为新元素,这样就可以得到类似<firstAndLastName>Sundar Kumar</firstAndLastName>
的内容。然后,您可以使用当前的通配符解决方案来查询这些值。
如果这不是一个选项,那么你可以在MarkLogic中进行相当的连接,称为&#34; shotgun OR&#34;或&#34;分散查询&#34;。在这里,您可以使用通配符来查询每个名字和姓氏元素的值。然后你可以&#34;霰弹枪&#34;它们是第二个查询,它从文档中检索值对,其中任一元素与其中一个值匹配。这仍然在索引中完成,因此它应该满足任何自动完成性能要求。
let $autocomplete := 'Su'
let $qnames := (xs:QName('firstName'), xs:QName('lastName'))
let $values := cts:element-value-match($qnames, $autocomplete||'*')
let $element-refs :=
for $q in $qnames
return cts:element-reference($q)
let $tuples :=
cts:value-tuples($element-refs, (),
cts:element-range-query($qnames, '=', $values))
for $t in $tuples
return string-join(json:array-values($t), ' ')
答案 1 :(得分:0)
这可以用来在两个名字上获得自动填充
let $inputText := "su"
let $Names := <Names>
{
for $each in doc()/employee[(fn:contains(lower-case(firstName/text()), lower-case($inputText))) or (fn:contains(lower-case(lastName/text()), lower-case($inputText)))]
let $firstName := $each/firstName/text()
let $lastName := $each/lastName/text()
return <Full-Name>{concat(lower-case($firstName)," ",lower-case($lastName))}</Full-Name>
}
</Names>
答案 2 :(得分:0)
高级搜索API是您的应用程序的选项吗?如果是,我建议为包含正则化名称的数据添加新元素,创建元素范围索引,然后使用search:suggest
(http://docs.marklogic.com/search:suggest?q=search:suggest&v=8.0&api=true)作为预先输入的UI组件。这是实现自动完成可接受的100毫秒响应时间的一种方法。