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

时间:2012-12-18 19:05:07

标签: marklogic thesaurus

假设您拥有包括美国,美国和美国在内的美利坚合众国的词库条目。不是最好的例子,但你明白了。用户搜索美国政府。你如何解析这个字符串以传递到thsr:expand函数?
“美国政府”不起作用,也不是我想要的。我希望词库为“美国”而来,以便返回美国政府和美国政府的文件。提前谢谢。

1 个答案:

答案 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示例代码进行微小的更改(它会跳过引用的短语)。