我正在使用search-api
并想知道如何即时操纵搜索结果?我需要这样的东西:
我需要根据一些标准对我的结果集进行排序,如果标准的值为空,那么我应该应用一些任意整数值,这样我就不会得到xdmp:cast
异常。
请帮忙。
问候阿米特
我正在使用search-api
并想知道如何即时操纵搜索结果?我需要这样的东西:
我需要根据一些标准对我的结果集进行排序,如果标准的值为空,那么我应该应用一些任意整数值,这样我就不会得到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
您应该能够在搜索约束中指定相同的排序规则。相应的范围索引将是具有相同排序规则的字符串索引。
尝试使用最少的空(http://www.w3.org/TR/xquery/#id-orderby-return)。那应该可以使您的空值最后显示。
for $each in $x/ArticleSequenceNumber
stable order by xs:integer($each) empty least
return $each
如果您在 ArticleSequenceNumber 上放置一个范围索引并在正确的位置进行排序,您将从索引中获得排序。
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