2

在 search:suggest 功能的帮助下,我无法提供这个简单的自动完成功能。

基于来自 Marklogic Demo 数据的 Oscars 语料库,我尝试提供一个建议查询,例如,即使用户当前正在写“Robert Lo”或“Loggia Rob”甚至“ L罗布”。

目前,我只能通过这个简单的查询在他的一些同行中返回“Robert Loggia”:

let $options := 
<options xmlns="http://marklogic.com/appservices/search">
  <default-suggestion-source>
    <range type="xs:string">
      <element ns="http://marklogic.com/wikipedia" name="name" />
    </range>
  </default-suggestion-source>
</options>
return search:suggest("Rob",$options)

但是一旦我写了一个两个词的短语,我就不确定如何写,因为我在等待的答案都不正确。例如 :

search:suggest("Robert Lo",$options)

或者

search:suggest(("Robert", "Lo"),$options)

是因为缺少选项、索引错误配置还是误用功能?

感谢帮助

4

3 回答 3

3

grammar-aware

如果您想获得有关短语的建议,您需要在短语周围添加引号,否则它会单独处理标记。尝试以下操作:

search:suggest('"Robert Lo"',$options)
于 2011-09-09T14:06:48.423 回答
2

这是一个常见的错误,我自己也犯过几次。

正如科琳所说,您需要在查询字符串周围加上引号。这与使用搜索 API 或 google 进行一般搜索相同:带引号的参数被视为一个短语,没有每个标记是一个单独的参数。

如果没有引号,默认行为是将这两个术语视为单独的标记,并在查询中将它们与或或结合在一起,具体取决于您的配置。

于 2011-09-09T19:07:38.220 回答
1

在 OS X 上使用 4.2-6 对我来说也很奇怪。这是我使用完整的 oscars 数据集在测试中的结果。

import module namespace search = "http://marklogic.com/appservices/search"
    at "/MarkLogic/appservices/search/search.xqy";

let $options := 
<options xmlns="http://marklogic.com/appservices/search">
  <default-suggestion-source>
    <range type="xs:string">
      <element ns="http://marklogic.com/wikipedia" name="name" />
    </range>
  </default-suggestion-source>
</options>
return search:suggest("Robert Lo", $options)
=>
Robert "Loretta Young"
Robert "Lorraine Bracco"
Robert "Lotte Lenya"
Robert "Louis Calhern"
Robert "Louis Gossett, Jr."
Robert "Louis Malle"
Robert "Louise Fletcher"

看起来这些值是为 or-query(('Robert', 'Lo')) 生成的,然后以一种奇怪的方式合并。如果我们使用 cts lexicon 函数,事情看起来很正常。

cts:element-value-match(
  QName('http://marklogic.com/wikipedia', 'name'),
  'Robert Lo*')
=>
Robert Loggia

单词交换方面使事情变得更加复杂,并且超出了自动建议通常所做的范围(以及在没有帮助的情况下可以做什么search:suggestcts:element-value-match

这是一个版本,它使用额外的字符串操作来创建两个模式,处理成对的单词。它假定第一个单词总是完整的,而第二个单词可能是一个存根,但可能需要交换这些单词以进行匹配。如果您定义了所需的逻辑,您应该能够对其进行修改以满足您的要求。请注意,函数映射正在发挥作用,因此cts:element-value-match在评估期间每个模式调用一次。这可能会对性能产生影响。

let $toks := cts:tokenize($INPUT)[. instance of cts:word]
let $pat := (
  if (count($toks) eq 1) then concat($toks, '*')
  else (
    concat($toks[2], '* ', $toks[1]),
    concat($toks[1], ' ', $toks[2], '*')))
return cts:element-value-match(
  QName('http://marklogic.com/wikipedia', 'name'),
  $pat)
=>
Robert Loggia
于 2011-09-01T15:17:31.433 回答