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"