4

今のところ、このコードを使用して、MarkLogic 検索から取得した JSON ドキュメントに基づいてスニペットを生成しています。

xquery version "1.0-ml";
module namespace searchlib="http://ihs.com/lib/searchlib";
import module namespace search="http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy"; 
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";

declare function searchlib:get-snippet($docc,$words) {
  let $doc:= json:transform-from-json($docc)
  let $squery := search:parse($words)
  let $result := <result>{search:snippet($doc,$squery,
  <transform-results apply="snippet" xmlns="http://marklogic.com/appservices/search">
          <max-snippet-chars>255</max-snippet-chars>

      </transform-results>)}</result>

  return $result//search:match
};

私が使用している検索を実行するとき:

cts.jsonPropertyValueQuery(fieldname, values, 
                                             ['case-insensitive', 'diacritic-insensitive'])

そのため、検索は発音記号を区別せずに機能し、良い結果が得られますが、 のようにオプションsearch:snippetを渡すことができません。diacritic-insensitivects.jsonPropertyValueQuery

ドキュメントでは、説明でこれを見ることができます

検索文法を定義し、検索を制御するオプション。関数 search:search の $options の説明を参照してください。search:snippet; では、transform-results オプションに apply 属性を指定できないことに注意してください。別のスニペット関数を使用するには、代わりに search:search または search:resolve を使用してください。

しかし、ここでは次のとおりです。

search:snippet(
   $result as node(),
   $cts-query as schema-element(cts:query),
   [$options as element(search:transform-results)?]
) as element(search:snippet)

では、他のオプションを search:snippet に渡せないということですか? または、これを行うオプションはありますか?

私はそれを使用してテストしてchávezおり、結果を生成していますが、スニペットは、そのドキュメントを意味する完全一致を含むドキュメントに対してのみ適切に生成されます

チャベスは何かをした

強調表示されずChavez

チャベスは何かをした

ハイライトになります

前もって感謝します!

4

1 に答える 1

2

問題は にオプションを渡さないことにありましsearch:snippetたが、search:parse

xquery version "1.0-ml";
module namespace searchlib="http://ihs.com/lib/searchlib";
import module namespace search="http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy"; 
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";

declare function searchlib:get-snippet($docc,$words) {
  let $doc:= json:transform-from-json($docc)
  let $squery := search:parse($words,
<options xmlns="http://marklogic.com/appservices/search">
<term>
<term-option>case-insensitive</term-option>
<term-option>diacritic-insensitive</term-option>
</term>
</options>, "cts:query")

  let $result := <result>{search:snippet($doc,$squery,
  <transform-results apply="snippet" xmlns="http://marklogic.com/appservices/search">
          <max-snippet-chars>255</max-snippet-chars>

      </transform-results>)}</result>

  return $result//search:match
};

通過

<term-option>diacritic-insensitive</term-option>

それをsearch:parse機能させるために。

MarkLogicからの説明は次のとおりです。

このsearch:snippet()関数を使用すると、一致するテキストを抽出し、ハイライトのタグを付けて、包含ノードにラップされた一致を返すことができます。ただし、search:snippet が正しいテキストを抽出できるようにするにはcts:query()、snippet に渡される が一連の値と一致する必要があります。の場合search:snippetcts:query通常は への呼び出しの結果ですsearch:parse。このsearch:parse()関数は、指定されたオプションに従ってクエリ テキストを解析し、適切な cts:queryXML を返します。

于 2015-09-16T06:29:41.433 に答える