Azure Search如何按匹配文本位置及字母顺序排序搜索结果
Azure Search 前缀查询按匹配位置排序配置方法
问题背景
- 目标排序规则:搜索结果优先按匹配文本在检索字段中的起始位置升序排列(匹配位置越靠前优先级越高),匹配位置相同的结果再按字段文本字母顺序升序排列。
- 测试数据集:
PATRICK STREET WEST MOUNT ST PATRICK ROAD PATTI MCCULLOCH WAY
- 测试查询:前缀查询
Pat* - 期望排序结果:
PATRICK STREET WEST PATTI MCCULLOCH WAY MOUNT ST PATRICK ROAD
- 实际不符合预期的返回结果(默认按BM25相关性评分排序):
PATRICK STREET WEST MOUNT ST PATRICK ROAD PATTI MCCULLOCH WAY
默认排序不符合预期的核心原因是Azure Search默认使用BM25相关性评分排序,评分逻辑基于分词后的词元权重、词频、字段长度计算,不会按照匹配子串的起始位置排序。
具体配置步骤
1. 检索字段配置调整
确保用于检索的目标字符串字段(如示例中的道路名称字段)满足以下要求:
- 开启**可排序(sortable)**权限,允许在排序逻辑中调用该字段
- 若不需要词形还原、词根提取等特殊分词规则,给字段配置
standard标准分析器即可;如果需要做精确的字符串匹配,可配置microsoft_lowercase_keyword_analyzer小写关键词分析器,避免分词拆分导致的命中结果和实际子串不匹配问题。
字段配置示例:
{ "name": "roadName", "type": "Edm.String", "searchable": true, "sortable": true, "analyzer": "standard" }
2. 检索请求参数调整
- 前缀查询保持原有
Pat*语法,searchMode设置为all,确保所有包含匹配前缀的结果都被召回 - 放弃默认的
search.score()(BM25相关性评分)作为第一排序规则,在$orderby参数中通过OData内置函数直接计算匹配前缀的起始位置,按位置升序排列,位置相同的再按字段本身的字母顺序升序排列。
排序参数示例(单前缀查询场景):
$orderby=indexof(tolower(roadName), tolower('Pat')) asc, roadName asc
注意:如果查询词是动态传入的,只需将用户输入的前缀去掉末尾通配符
*后,填充到indexof的第二个参数位置即可,同时对两边内容都做小写转换,避免大小写差异导致位置计算错误。
效果验证
针对3条测试数据,上述排序逻辑的计算结果如下:
PATRICK STREET WEST:匹配起始位置为0,字段字符串序靠前,排第1位PATTI MCCULLOCH WAY:匹配起始位置为0,字段字符串序靠后,排第2位MOUNT ST PATRICK ROAD:匹配起始位置为9,排第3位
完全符合预期排序要求。
内容的提问来源于stack exchange,提问作者Harsh Gupta
相关产品推荐
相关产品推荐

