假设您拥有包括美国,美国和美国在内的美利坚合众国的词库条目。不是最好的例子,但你明白了。用户搜索美国政府。你如何解析这个字符串以传递到thsr:expand函数?
“美国政府”不起作用,也不是我想要的。我希望词库为“美国”而来,以便返回美国政府和美国政府的文件。提前谢谢。
答案 0 :(得分:1)
除非最近进行了更改,否则thsr:expand
不适用于多个单词同义词术语。但是,可以滚动自己的多词同义词扩展。
该解决方案有几个步骤,我实际上已经给出了这一点 - 确切地说 - 在MarkLogic World的一个名为Search Intelligence and MarkLogic API的演示文稿中作为示例。如果你想跳过,那么多字词同义词例子从幻灯片32开始。
我还放了all the code from the presentation up on Github。
的要点是:第一个search:parse
,并转换CTS:查询XML到包含“运行”的中间型XML(如果你熟悉的WordML)。然后使用cts:highlight
和同义词术语的OR查询扩展运行。最后,剩余的运行被解析回cts:query XML,并使用search:resolve
进行搜索。
它非常快,但如果你的词库真的很大,那么通过一些优化可以提高速度。
<强>更新强>
我只注意到你只可以试图扩大带引号的短语多个引用短语的同义词,而我的例子扩张不带引号的短语为以AND字查询(不带引号的短语)的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示例代码进行微小的更改(它会跳过引用的短语)。