如何在短语上使用MarkLogic同义词库API?
假设您有一个关于美利坚合众国的词库条目,其中包括美国、美国和美国。不是最好的例子,但你明白了。用户搜索美国政府。如何解析此字符串以传递到thsr:expand函数?如何在短语上使用MarkLogic同义词库API?,marklogic,thesaurus,Marklogic,Thesaurus,假设您有一个关于美利坚合众国的词库条目,其中包括美国、美国和美国。不是最好的例子,但你明白了。用户搜索美国政府。如何解析此字符串以传递到thsr:expand函数? “美国政府”是行不通的,这也不是我想要的。我想要“美国”的同义词表entires,以便返回与美国政府和美国政府的文件。提前感谢。除非最近做了更改,thsr:expand不适用于多词同义词库术语。但是,您可以使用自己的多词同义词库扩展 解决方案有几个步骤,我在MarkLogic World的一次演讲中给出了一个例子,题目是。如果您想跳
“美国政府”是行不通的,这也不是我想要的。我想要“美国”的同义词表entires,以便返回与美国政府和美国政府的文件。提前感谢。除非最近做了更改,
thsr:expand
不适用于多词同义词库术语。但是,您可以使用自己的多词同义词库扩展
解决方案有几个步骤,我在MarkLogic World的一次演讲中给出了一个例子,题目是。如果您想跳到前面,多词同义词库示例将从幻灯片32开始
我还提出了一些建议
要点是:首先search:parse
并将cts:queryxml转换为包含“runs”的中间类型XML(如果您熟悉WordML)。然后使用cts:highlight
和词库术语的OR查询扩展运行。最后,剩余的运行将解析回cts:queryxml,并使用search:resolve
进行搜索
它相当快,但是如果你的同义词库真的很大,那么通过一些优化,速度可能会提高
更新
我刚刚注意到,您可能只尝试将一个带引号的短语扩展为多个带引号的短语同义词,而我的示例将不带引号的短语扩展为OR查询和ed单词查询(不带引号的短语)
实际上,您可以跳过运行创建/解析步骤,并将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(doc('thesaurus.xml')//thsr:entry/thsr:term/cts:word-query(string(.)))))
不过,这只适用于引用的短语。因此,如果您想对不带引号的短语进行操作,您仍然需要创建运行。如果您想同时对这两种语言进行操作,则需要对github示例代码做一些小的更改(它跳过引用的短语)