首页 > 解决方案 > MarkLogic 错误地按分数排序结果

问题描述

我在 MarkLogic 的search:search()函数中遇到了一个非常奇怪的问题。使用约束选项时,它似乎没有正确按分数排序。以下是我调用搜索的函数的编辑版本:

declare function s:book-search(
        $query as xs:string*,
        $subjects as xs:string*,
        $start as xs:unsignedLong?,
        $page-length as xs:unsignedLong?)  as element(search:response){
        
    let $subject-ids :=  fn:tokenize($subjects, ',')
    let $subject-query := 
        if(fn:count($subject-ids) > 0)
        then
            for $id in $subject-ids            
                return 'metadata/subject/'||$id       
        else
            ()
    
    let $options := 
        <options xmlns="http://marklogic.com/appservices/search">
            <searchable-expression xmlns:m="http://replacedrealwebsite.com/collection/book-metadata">
                /m:metadata
            </searchable-expression>
            <constraint name="subject">
                <collection prefix="metadata/subject/" facet="true" />
            </constraint>
            {
               if(fn:count($subject-query) > 0)
               then
                   <additional-query>{cts:collection-query($subject-query)}</additional-query>
               else
                   ()
            }
            <term>
                <term-option>case-insensitive</term-option>
                <term-option>diacritic-insensitive</term-option>
                <term-option>punctuation-insensitive</term-option>
            </term>
            <sort-order direction="descending">
                <score/>
            </sort-order>
            <transform-results apply="empty-snippet"/>
            <search-option>unfiltered</search-option>
        </options>

    return search:search($query, $options, $start, $page-length)    
};

如果我$subjects在没有$query参数的情况下传入任何内容,则结果排序不正确,而且排序方式也很奇怪。例如,这里是一个分数列表,按照它们从一个大页面长度的测试调用返回的顺序排列,以查看所有结果:

[
  "7808768",
  "334592",
  "285952",
  "197120",
  "113408",
  "74496",
  "34816",
  "7808256",
  "7705856",
  "7694592",
  "2031360",
  "1144832",
  "629504",
  "181760",
  "145664",
  "70656",
  "62208",
  "57856",
  "-208384",
  "8101632",
  "7853056",
...
]

如您所见,最高分并不是第一个结果。此外,它按降序排序,但随后它会“跳”到高分,然后再次下降。我似乎无法识别任何模式或顺序。

让这个陌生人感到奇怪的是,如果我添加一个非空白$query参数,分数就会正确排序!这是我将一个简单的单词传递给$query参数时的分数示例:

[
  "8403200",
  "8154624",
  "8153856",
  "8110336",
  "8109824",
  "8007424",
  "7988992",
  "7982080",
  "5464320",
  "2332928",
  "1456128",
  "931072",
  "587520",
  "509440",
  "483328",
  "447232",
  "435200",
  "429312",
  "424704",
  "381952",
  "376064",
  "373504",
...
]

一段时间以来,我一直在尝试摆弄搜索选项,但不知道为什么会发生这种情况。任何想法将不胜感激。

我运行的 MarkLogic 版本是 10.0-6.4

我还应该注意,在运行 10.0 且代码相同的测试服务器上不会发生此问题,这让我认为这是 MarkLogic 的错误或我缺少的版本之间的微小差异。

编辑:我注意到的另一件奇怪的事情是,如果我将排序更改为

<sort-order direction="ascending">
   <score/>
</sort-order>

然后以正确的升序返回结果。所以只有降序被破坏。

标签: xquerymarklogic

解决方案


推荐阅读