如何使用Regex实现无连字符查询匹配含连字符的对应词汇
解决方案
最优方案:自定义分析器预处理(性能远优于正则查询)
Azure Cognitive Search 支持为字段配置自定义分析器,你可以在索引构建阶段添加字符过滤器,直接移除所有会导致分词断裂的特殊字符(连字符、撇号、感叹号、空格等),索引中存储的将是不含特殊字符的纯文本。查询时你只需要提前把用户输入的查询词也做一次相同的特殊字符移除处理,再发起普通搜索即可,完全不需要复杂正则,查询性能可以达到原生搜索的水平,是生产环境的首选方案。
备选方案:优化动态正则生成逻辑
不存在可以直接实现该需求的原生正则语法,正则本身没有「忽略指定字符匹配」的内置能力,动态生成字符间插特殊字符可选规则的逻辑是查询侧唯一可行的实现方式。如果当前你无法修改索引配置,只能通过 Lucene 正则实现需求,可以按以下逻辑优化你的现有方案:
- 提前定义需要忽略的特殊字符集合:
[-'\.! ](可以根据实际需要增减字符) - 在代码层面处理用户输入的查询词,将每个字符之间插入特殊字符的可选匹配规则,比如输入
homework,生成的正则为:
h[-'\.! ]*o[-'\.! ]*m[-'\.! ]*e[-'\.! ]*w[-'\.! ]*o[-'\.! ]*r[-'\.! ]*k
提示:用
*代替?可以兼容连续出现多个特殊字符的场景,比如home--work也能正常匹配。
- Azure Cognitive Search 中发起查询时指定
queryType=full,将生成的正则包裹在/中即可生效。
性能说明
只要查询词长度不超过20字符,Lucene 处理这类正则的性能完全可以满足常规业务需求,不需要过度担心性能问题,仅数据量过亿的极端场景会有明显延迟。
内容的提问来源于stack exchange,提问作者UnicornSnuggler
相关产品推荐
相关产品推荐

