Xquery 如何在一个元素中进行多术语搜索

Xquery 如何在一个元素中进行多术语搜索,xquery,marklogic,Xquery,Marklogic,我试图进行一次搜索,检查查询字符串中的每个单词是否包含在特定元素中。例如,如果$query=“Sports With Stripes”则特定元素必须包含所有三个单词(以任何顺序,因此它不是短语) 要将搜索限制到元素,我有以下约束: <constraint name="inelement"> <word> <element ns="" name="myElement"/>

我试图进行一次搜索,检查查询字符串中的每个单词是否包含在特定元素中。例如,如果
$query=“Sports With Stripes”
则特定元素必须包含所有三个单词(以任何顺序,因此它不是短语)

要将搜索限制到元素,我有以下约束:

        <constraint name="inelement">
            <word>
                <element ns="" name="myElement"/>
                <term-option>case-insensitive</term-option>
            </word>
        </constraint>
这不起作用,因为它只是将
“点”
限制在我的元素中

然后我尝试了下面的方法,这确实得到了我需要的结果,但我想知道这是实现这一目标的唯一方法,还是有其他方法,比如在搜索词之间使用运算符

search:search('inelement:spots inelement:with inelement:stripes', $options, 1, 25)

有更好的办法吗?或者,在将约束添加到我的
search:search
之前,我是否必须手动解析我的查询字符串以将它们分离为单个单词?

而不是
search:search
您可以使用
search:parse
search:resolve
的组合,并在两者之间进行自定义处理。如果希望始终在特定元素中搜索,可以在这些步骤之间更新查询

declare function local:word-to-element-query(
  $element as xs:QName,
  $query as item()
) as item()
{
  typeswitch ($query)
  case element(cts:word-query)
    return cts:element-word-query($element, 
      $query/cts:text/string(),
      $query/cts:option/string())
  case text() return $query
  default return 
    element { node-name($query) } {
      $query/@*, local:word-to-element-query($element, $query/node())
    }
};

let $query := 
  local:word-to-element-query(
    xs:QName('myElement'),
    search:parse('spots with stripes'))
return search:resolve($query)

递归typeswitch模板是修改默认解析输出和添加其他自定义逻辑的好策略。

要在空白处应用约束,请使用引号

inelement:"spots with stripes"
使用将返回单个元素单词术语的默认解析器。要将术语分解为单词,可以编写一个自定义解析器函数。这里有一个例子

您可能需要一个
cts:near查询
,以确保所有三个单词都在同一个元素中。您可能需要在数据库配置中启用
元素单词位置

inelement:"spots with stripes"