United States、USA、および America を含むアメリカ合衆国のシソーラス エントリがあるとします。最良の例ではありませんが、アイデアはわかります。ユーザーが米国政府を検索します。この文字列をどのように解析して thsr:expand 関数に渡しますか?
「合衆国政府」は機能しませんし、私が望んでいるものでもありません。米国政府とアメリカ合衆国政府のドキュメントが返されるように、「United States」のシソーラス全体が必要です。前もって感謝します。
1 に答える
最近変更が加えられていない限り、 はthsr:expand
複数単語シソーラス用語では機能しません。ただし、独自の複数単語シソーラス展開を展開することは可能です。
ソリューションにはいくつかのステップがありますが、私はこれを正確に例として、MarkLogic World でのSearch Intelligence and MarkLogic APIというタイトルのプレゼンテーションで例として挙げました。複数単語のシソーラスの例は、スライド 32 から始まります。
また、プレゼンテーションのすべてのコードを Github にアップロードしました。
要点は次のとおりです。まずsearch:parse
、cts:query 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 のサンプル コードに小さな変更を加える必要があります (引用句をスキップします)。