使用2个元素自动完成:marklogic

使用2个元素自动完成:marklogic,marklogic,Marklogic,通过使用单词词典或范围索引,我可以为一个元素设置自动完成值,如果我想搜索两个元素(firstName和lastName)并显示这两个元素的结果呢 你知道如何在marklogic中实现同样的功能吗 e、 g Employee1.xml 日落 库马尔 钱归零 Employee2.xml 晴朗的 库马尔 钱归零 Employee3.xml 圣达 库马尔 钱归零 输入1:Su 预期输出:Sundeep Kumar 桑达尔·库马尔 阳光库马尔 投入2:库马尔 预期输出:Sundeep Kumar 桑达尔·

通过使用单词词典或范围索引,我可以为一个元素设置自动完成值,如果我想搜索两个元素(firstName和lastName)并显示这两个元素的结果呢

你知道如何在marklogic中实现同样的功能吗

e、 g

Employee1.xml
日落
库马尔
钱归零
Employee2.xml
晴朗的
库马尔
钱归零
Employee3.xml
圣达
库马尔
钱归零
输入1:Su
预期输出:Sundeep Kumar
桑达尔·库马尔
阳光库马尔
投入2:库马尔
预期输出:Sundeep Kumar
桑达尔·库马尔
阳光库马尔

理想的方法是在将这些文档导入数据库时,将名字和姓氏元素反规范化为新元素,这样就有了类似于
Sundar Kumar
的东西。然后可以使用当前的通配符解决方案查询这些值

如果这不是一个选项,那么您可以在MarkLogic中执行等效的连接,称为“散弹枪或”或“分散查询”。在这里,您可以使用通配符来查询每个first和last name元素的值。然后,您可以将它们“散弹”到第二个查询中,该查询从文档中检索两个值对,其中任何一个元素都与其中一个值匹配。这仍然是在索引中完成的,因此它应该满足任何自动完成性能要求

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), ' ')

这是一个可以用来获得两个名字的自动完成

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>
let$inputText:=“su”
让$Names:=
{
对于doc()/employee[(fn:contains(小写(firstName/text())、小写($inputText))或(fn:contains(小写(lastName/text())、小写($inputText)))]
让$firstName:=$each/firstName/text()
让$lastName:=$each/lastName/text()
返回{concat(小写($firstName),“”,小写($lastName))}
}

高级搜索API是应用程序的一个选项吗?如果是,我建议向包含正则化名称的数据中添加新元素,创建元素范围索引,然后对typeahead UI组件使用
search:suggest
()。这是实现自动完成可接受的100 ms响应时间的一种方法

非常感谢!!!您可以帮助使用java等效代码来执行join(Scatter或‘shotgun或’)?@SundeepKumarMehta您可以将其保存为XQuery模块,并从java调用它。否则,您可能应该问另一个问题,并特别注意您正在使用的Java接口。我是否可以使用value-co-occurrences从2个元素中获取上述详细信息,因为它也是从索引中检索的?@SundeepKumarMehta是的,但是
cts:value-tuples
cts:value-co-occurrences
都使用索引。主要区别在于共现仅限于2个值。问题是如何执行自动完成,而这个答案并没有解决这个问题。@wst,我刚刚发现我所做的是错误的。请参见上面更新的查询对于任何数量较大的名称,此查询的执行速度不太可能足够快,以满足autocomplete的延迟要求(通常约150ms)。
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>