我正在使用search-api
并想知道如何动态操作搜索结果?我需要这样的东西:
我需要根据某些条件对结果集进行排序,如果条件的值为null,那么我应该应用一些任意整数值,这样我就不会得到xdmp:cast
异常。
请帮忙。
此致 阿米特
答案 0 :(得分:1)
每次重新排序都需要新的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
您应该能够在搜索约束中指定相同的排序规则。相应的范围索引将是具有相同排序规则的字符串索引。
答案 1 :(得分:0)
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
答案 2 :(得分:0)
尝试使用空的最小(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上放置一个范围索引并在正确的位置进行排序,你将得到索引的排序。