OData查询前置通配符时search.ismatch无结果解决方案
OData前置通配符查询无结果问题解决
问题复现
- 后缀通配符查询可正常运行,示例语句:
$filter=search.ismatch('lux*', 'Description')
- 编写前置通配符语句查询Description字段中所有以
lux结尾的内容时,执行后无结果返回,但数据源中实际存在符合规则的记录,测试语句:
$filter=search.ismatch('*lux', 'Description')
- 叠加Hotel字段等值过滤的组合查询逻辑后,依然无结果返回,测试语句:
search=&$filter=Hotel eq 'Southern' and search.ismatch('*lux', 'Description')
- 预期结果:筛选Hotel字段值为
Southern的记录时,返回Description字段值为Ultra lux、Mega lux的2条数据。
问题原因
search.ismatch的默认简单查询语法仅支持后缀通配符(通配符放在词项末尾),前置通配符(*xxx)、中置通配符(x*xx)均属于默认不支持的写法,这类写法会被搜索解析器判定为无效词项跳过匹配,最终导致返回结果为空。
修复方案
使用search.ismatch支持的正则匹配模式实现词尾匹配,不需要依赖前置通配符:
- 单字段词尾匹配写法
传入正则表达式/lux$/,其中$符在正则中代表匹配字符串结尾,刚好满足“以lux结尾”的匹配需求,语句示例:$filter=search.ismatch('/lux$/', 'Description') - 多字段组合过滤写法
将原语句中的前置通配符部分替换为上述正则表达式即可,修正后可正常返回预期结果,语句示例:search=&$filter=Hotel eq 'Southern' and search.ismatch('/lux$/', 'Description')
提示:如果查询未返回预期结果,可检查Description字段配置的分析器是否会把
lux拆分为独立词项,若使用了自定义分词规则,需要对应调整正则表达式适配分词结果。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

