2

search:suggest 関数の助けを借りて、この単純なオートコンプリート機能を提供することはできません。

Marklogic デモ データのオスカー コーパスに基づいて、たとえば、ユーザーが現在「Robert Lo」または「Loggia Rob」または「 L・ロブ」。

現在、次の単純なクエリを使用して、一部の仲間の中で「Robert Loggia」を返すことしかできません。

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("Rob",$options)

しかし、2 語のフレーズを書いているとすぐに、その書き方がよくわからなくなります。なぜなら、私が待っている答えはどれも正しいものではないからです。例えば ​​:

search:suggest("Robert Lo",$options)

また

search:suggest(("Robert", "Lo"),$options)

オプションの欠落、インデックスの設定ミス、または誤用された機能が原因ですか?

手伝ってくれてありがとう

4

3 に答える 3

3

ですgrammar-aware

フレーズの提案を取得したい場合は、フレーズを引用符で囲む必要があります。そうしないと、トークンが個別に処理されます。次のことを試してください。

search:suggest('"Robert Lo"',$options)
于 2011-09-09T14:06:48.423 に答える
2

これはよくある間違いで、私自身も何度か犯してきました。

Colleen が言うように、クエリ文字列を引用符で囲む必要があります。これは、一般的に検索 API や google を使用して検索するのと同じです。引用符を使用すると、引数はフレーズと見なされ、各トークンを使用しない場合は個別の引数と見なされます。

引用符がない場合、既定の動作では、2 つの用語を個別のトークンと見なし、構成に応じてクエリ内でそれらを AND または OR します。

于 2011-09-09T19:07:38.220 に答える
1

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
于 2011-09-01T15:17:31.433 に答える