TEI Publisher通用搜索结果排序异常,求按字母及div排序方案
TEI Publisher通用搜索结果排序问题解决思路
问题背景
基于XML/TEI的历史文本数字化项目部署在TEI Publisher平台,当前存在以下问题:
- 分面搜索结果按文章字母顺序正常展示,但通用搜索结果呈随机排序
- 需求:通用搜索结果需按文章字母顺序排列,且同一文本下的结果按
<div>元素的顺序排序 - 已尝试修改
search.xql中的排序语句,但无效果,怀疑需调整query.xql、navigation.xql或query-tei.xql等核心搜索文件
关键排查与修改步骤
1. 定位核心搜索逻辑文件
TEI Publisher的通用搜索结果集通常由query.xql或query-tei.xql生成,search.xql多负责前端渲染,优先检查这两个文件:
- 找到包含
cts:search或xdmp:search的查询语句块,确认是否未指定排序规则(无排序时引擎会随机返回结果)
2. 添加两级排序规则
在搜索结果生成的XQuery代码中,插入按文档标题/标识符和div元素位置的排序逻辑:
let $query := ... (: 原有查询逻辑保留 :) let $raw-results := cts:search(collection(), $query) let $sorted-results := for $hit in $raw-results let $root-doc := $hit/ancestor-or-self::TEI <!-- 第一排序键:文章标题,根据你的TEI结构调整路径 --> let $doc-title := $root-doc/teiHeader/fileDesc/titleStmt/title/text() <!-- 第二排序键:div的顺序,若用@n标记则转整数,否则用节点位置计数 --> let $div-position := if ($hit/ancestor-or-self::div/@n) then $hit/ancestor-or-self::div/@n => xs:integer() else count($hit/ancestor-or-self::div/preceding-sibling::div) + 1 order by $doc-title ascending, $div-position ascending return $hit return $sorted-results
3. 检查分页逻辑的排序传递
如果搜索结果涉及分页,需确认navigation.xql中是否保留了排序参数:
- 避免分页请求时重置排序规则,确保分页后的结果仍遵循设定的排序逻辑
4. 验证渲染层的结果使用
回到search.xql,确认渲染时调用的是排序后的$sorted-results变量,而非原始未排序的结果集,避免变量传递错误导致排序失效
TEI结构适配示例
假设你的TEI文档结构如下:
<TEI xmlns="http://www.tei-c.org/ns/1.0"> <teiHeader> <fileDesc> <titleStmt> <title>19th Century Essay Collection</title> </titleStmt> </fileDesc> </teiHeader> <text> <div n="1">Introduction</div> <div n="2">Main Body</div> <div n="3">Conclusion</div> </text> </TEI>
则排序逻辑中的$doc-title和$div-position可直接匹配上述结构,若你的div未用@n标记,改用节点位置计数即可。
测试验证
修改完成后重启TEI Publisher服务,执行通用搜索:
- 验证不同文章的结果按标题字母顺序排列
- 验证同一文章内的结果按div的先后顺序展示
内容的提问来源于stack exchange,提问作者ndso86
相关产品推荐
相关产品推荐

