自动完成包含2个元素:marklogic

时间:2015-04-16 19:53:43

标签: marklogic

通过使用单词词典或范围索引,我可以为一个元素设置自动完成值,如果我想搜索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

3 个答案:

答案 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:suggesthttp://docs.marklogic.com/search:suggest?q=search:suggest&v=8.0&api=true)作为预先输入的UI组件。这是实现自动完成可接受的100毫秒响应时间的一种方法。