xquery - 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>
然后以正确的升序返回结果。所以只有降序被破坏。
解决方案
推荐阅读
- css - 如何使用 CSS 在表格 (tr) 中创建降序的左侧行号
- javascript - Firebase在添加/删除数据时,应用程序不止一次执行功能
- matlab - 过滤数据点以进行信号处理
- javascript - 如何制作另一个密钥而不是在firebase中替换它
- c - 如果我使用 free(),为什么会出现内存泄漏错误?C
- html - 无法使用 XPath 按索引查找元素
- java - 今天日期和旧日期之间的差异计算不正确
- java - Java JPA 日期提前 14 小时
- python - 使用 for 循环从元组创建字典
- swift - 如何让 SwiftUI Picker 在子视图中工作?(变灰)