0

我正在使用search-api并想知道如何即时操纵搜索结果?我需要这样的东西:

我需要根据一些标准对我的结果集进行排序,如果标准的值为空,那么我应该应用一些任意整数值,这样我就不会得到xdmp:cast异常。

请帮忙。

问候阿米特

4

3 回答 3

1

每次重新排序都需要一个新的 API 调用 -search:searchsearch: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

您应该能够在搜索约束中指定相同的排序规则。相应的范围索引将是具有相同排序规则的字符串索引。

于 2012-05-23T04:03:42.893 回答
0

尝试使用最少的空(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 上放置一个范围索引并在正确的位置进行排序,您将从索引中获得排序。

于 2013-10-23T06:10:28.920 回答
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
于 2012-05-23T05:35:20.957 回答