如何在短语上使用MarkLogic同义词库API?

如何在短语上使用MarkLogic同义词库API?,marklogic,thesaurus,Marklogic,Thesaurus,假设您有一个关于美利坚合众国的词库条目,其中包括美国、美国和美国。不是最好的例子,但你明白了。用户搜索美国政府。如何解析此字符串以传递到thsr:expand函数? “美国政府”是行不通的,这也不是我想要的。我想要“美国”的同义词表entires,以便返回与美国政府和美国政府的文件。提前感谢。除非最近做了更改,thsr:expand不适用于多词同义词库术语。但是,您可以使用自己的多词同义词库扩展 解决方案有几个步骤,我在MarkLogic World的一次演讲中给出了一个例子,题目是。如果您想跳

假设您有一个关于美利坚合众国的词库条目,其中包括美国、美国和美国。不是最好的例子,但你明白了。用户搜索美国政府。如何解析此字符串以传递到thsr:expand函数?

“美国政府”是行不通的,这也不是我想要的。我想要“美国”的同义词表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示例代码做一些小的更改(它跳过引用的短语)