search-api
検索結果をオンザフライで操作する方法を知りたいですか? 私はこのようなものが必要です:
いくつかの基準に基づいて結果セットをソートする必要があり、基準の値が null の場合は、例外が発生しないように任意の整数値を適用する必要がありxdmp:cast
ます。
助けてください。
よろしくアミット
search-api
検索結果をオンザフライで操作する方法を知りたいですか? 私はこのようなものが必要です:
いくつかの基準に基づいて結果セットをソートする必要があり、基準の値が null の場合は、例外が発生しないように任意の整数値を適用する必要がありxdmp:cast
ます。
助けてください。
よろしくアミット
並べ替えるたびに、新しい API 呼び出しが必要になります -search:search
またはsearch:resolve
. ソート キーに応じて検索オプションを適切に設定できます。
XDMP-CAST
例外を修正するには、基になるデータ型の問題を修正する必要があります。完全なエラー メッセージは何ですか?
編集: 書かれているように、このようなものを使用して非整数値を処理できます。
for $each in $x/ArticleSequenceNumber
order by
if ($each castable as xs:integer) then xs:integer($each)
else 0
return $each
しかし、検索 API はそのようなことを処理しません。検索 API は、検索結果が大きすぎてメモリ内に一度に収まらない大規模なデータベースを中心に設計されています。そのため、並べ替えに使用できる範囲インデックスがあることが期待されます。範囲インデックスは、クリーンな入力データに依存します。
ArticleSequenceNumber
通常の解決策は、要素を検索 API のソート キーとして使用する場合は、要素をクリーンアップすることです。要素が空になる場合は、ダミーの値を指定するか、XML から完全に削除します。
ただし、http://markmail.org/message/53pn6xioluwxdx4oが役立つ場合があります。ここでの考え方は、値を数値ではなく文字列として扱い、数値照合を使用して並べ替えるというものです。
for $each in $x/ArticleSequenceNumber
order by $each collation "http://marklogic.com/collation//MO"
return $each
検索制約で同じ照合を指定できるはずです。対応する範囲インデックスは、同じ照合順序を持つ文字列インデックスになります。
xquery version '1.0-ml';
let $x := <root>
<ArticleSequenceNumber/>
<ArticleSequenceNumber>1</ArticleSequenceNumber>
<ArticleSequenceNumber>5</ArticleSequenceNumber>
<ArticleSequenceNumber>10</ArticleSequenceNumber>
<ArticleSequenceNumber>63</ArticleSequenceNumber>
<ArticleSequenceNumber>54</ArticleSequenceNumber>
<ArticleSequenceNumber>19</ArticleSequenceNumber>
<ArticleSequenceNumber>21</ArticleSequenceNumber>
<ArticleSequenceNumber>29</ArticleSequenceNumber>
<ArticleSequenceNumber>11</ArticleSequenceNumber>
</root>
for $each in $x/ArticleSequenceNumber
order by xs:integer($each)
return $each
空の最小値 ( http://www.w3.org/TR/xquery/#id-orderby-return ) を使用してみてください。null 値が最後に表示されるようにする必要があります。
for $each in $x/ArticleSequenceNumber
stable order by xs:integer($each) empty least
return $each
ArticleSequenceNumber に範囲インデックスを配置し、適切な場所で並べ替えを行うと、インデックスから並べ替えが行われます。