OS X で 4.2-6 を使用している私にも奇妙に見えます。完全な oscars データ セットを使用したテストの結果は次のようになります。
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";
let $options :=
<options xmlns="http://marklogic.com/appservices/search">
<default-suggestion-source>
<range type="xs:string">
<element ns="http://marklogic.com/wikipedia" name="name" />
</range>
</default-suggestion-source>
</options>
return search:suggest("Robert Lo", $options)
=>
Robert "Loretta Young"
Robert "Lorraine Bracco"
Robert "Lotte Lenya"
Robert "Louis Calhern"
Robert "Louis Gossett, Jr."
Robert "Louis Malle"
Robert "Louise Fletcher"
or-query(('Robert', 'Lo')) の値が生成され、奇妙な方法でマージされているようです。cts レキシコン関数の使用に落とし込むと、物事は正常に見えます。
cts:element-value-match(
QName('http://marklogic.com/wikipedia', 'name'),
'Robert Lo*')
=>
Robert Loggia
search:suggest
単語交換の側面は物事をより複雑にし、autosuggest が通常行うこと (およびcts:element-value-match
助けなしで何ができるか) の範囲を超えています。
これは、追加の文字列操作を使用して 2 つのパターンを作成し、単語のペアを処理するバージョンです。最初の単語は常に完全であり、2 番目の単語はスタブである可能性がありますが、一致するために単語を交換する必要がある場合があると想定しています。目的のロジックを定義すると、要件に合わせてこれを変更できるはずです。関数マッピングが機能しているため、cts:element-value-match
評価中にパターンごとに 1 回呼び出されることに注意してください。これは、パフォーマンスに影響を与える可能性があります。
let $toks := cts:tokenize($INPUT)[. instance of cts:word]
let $pat := (
if (count($toks) eq 1) then concat($toks, '*')
else (
concat($toks[2], '* ', $toks[1]),
concat($toks[1], ' ', $toks[2], '*')))
return cts:element-value-match(
QName('http://marklogic.com/wikipedia', 'name'),
$pat)
=>
Robert Loggia