假设您有一个美利坚合众国的词库条目,其中包括 United States、USA 和 America。不是最好的例子,但你明白了。用户搜索美国政府。你如何解析这个字符串以传递给 thsr:expand 函数?
“美国政府”行不通,也不是我想要的。我想要“美国”的词库完整,以便返回美国政府和美利坚合众国政府的文件。提前致谢。
1 回答
除非最近进行了更改,否则thsr:expand
不适用于多词词库术语。但是,可以滚动您自己的多词词库扩展。
解决方案有几个步骤,实际上,我在 MarkLogic World 的题为Search Intelligence and MarkLogic API的演示文稿中给出了这个 - 完全正确 - 作为示例。如果您想向前跳过,多词词库示例从幻灯片 32 开始。
要点是:首先search:parse
将 cts:query XML 转换为包含“运行”的中间类型 XML(如果您熟悉 WordML)。cts:highlight
然后使用词库术语的 OR 查询扩展运行。最后,剩余的运行被解析回 cts:query XML,并使用search:resolve
.
它非常快,但是如果您的词库确实很大,则可以通过一些优化来提高速度。
更新
我刚刚注意到您可能只是试图将引用的短语扩展为多个引用的短语同义词,而我的示例将未引用的短语扩展为 AND ed 单词查询(未引用的短语)的 OR 查询。
您实际上可以跳过运行创建/解决步骤,并重新设计exprun:thsr-expand-runs
直接适用于短语的内容:
declare function exprun:thsr-expand-phrases(
$q as item(), (: cts:query XML :)
$q-thsr as item() (: thesaurus terms :)
) as item()
{
typeswitch($q)
case element(cts:word-query) return
if (not($q[@qtextpre and @qtextpost])) then $q
else (: this is a phrase :)
cts:highlight($q, $q-thsr,
if (count($cts:queries) gt 1)
then xdmp:set($cts:action, "continue") (: ignore matches within matches :)
else
element cts:word-query {
$q/namespace::*, $q/@*, $q/node(),
let $expanded-text :=
cts:highlight($q/cts:text, $q-thsr,
if (count($cts:queries) gt 1)
then xdmp:set($cts:action, "continue")
else thsr:lookup("/config/jmp-thesaurus.xml",
cts:word-query-text($cts:queries[1])//thsr:synonym/thsr:term/string()
)
where ($expanded-text ne $q/cts:text) (: found matches :)
return ($expanded-text,
element cts:option { 'synonym' })
}
else $q
case text() return $q
default return
element {node-name($q)}{
$q/namespace::*,
$q/@*,
exprun:thsr-expand-phrases($q/node(), $q-thsr)
}
};
您仍然需要提供此功能cts:or-query
的同义词库术语:
cts:or-query(doc('thesaurus.xml')//thsr:entry/thsr:term/cts:word-query(string(.)))))
不过,这只会对引用的短语起作用。因此,如果您想对未引用的短语进行操作,您仍然需要创建运行。如果您想对两者都进行操作,则需要对 github 示例代码进行细微更改(它会跳过引用的短语)。