结果使用Marklogic中的search-api进行操作

时间:2012-05-22 12:39:34

标签: marklogic

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

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

请帮忙。

此致 阿米特

3 个答案:

答案 0 :(得分: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

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

答案 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上放置一个范围索引并在正确的位置进行排序,你将得到索引的排序。