如何在SOLR查询中使用正则获取指定街道名称结果?
问题描述
我有一组包含街道名称与门牌号的数据集,示例如下:
12 HILL STREET 12A HILL STREET 12B HILL STREET 123 HILL STREET 12 HILARY STREET
执行查询语句 q=(street_name:12\ HILL*) 时,仅返回:
12 HILL STREET
但我期望获取以下结果:
12 HILL STREET 12A HILL STREET 12B HILL STREET
之前尝试过查询语句 q=(street_name:/12[A-Z]\ HILL*/),但没有返回任何结果,请问有没有合适的Solr查询方式实现需求?
可行的Solr查询方案
方案1:短语通配符查询(适配分词字段)
如果street_name是分词存储的字段,直接跨分词的正则会失效,用短语通配符查询可以精准匹配符合格式的记录:
q=(street_name:"12* HILL*")
这个写法会匹配以12开头(包含12、12A、12B)且后续紧跟以HILL开头内容的短语,刚好覆盖你需要的三条结果。
方案2:修正正则查询(针对不分词字段)
如果street_name是string类型(不分词存储),你之前的正则问题出在转义和匹配逻辑上,修正后即可生效:
q=(street_name:/12[A-Z]? HILL.*/)
其中[A-Z]?表示可选的大写字母(匹配12、12A、12B),.*/匹配后续任意内容,能精准筛选目标记录。
方案3:范围+前缀组合查询
针对门牌号做范围匹配,结合街道名前缀查询:
q=(street_name:[12 TO 12C] AND street_name:HILL*)
这个范围会包含12、12A、12B这类格式的门牌号,同时匹配街道名以HILL开头的记录,也能得到预期结果。
关键注意点
- 先确认
street_name的分词器配置:如果用标准分词器,12A会被拆成12和A,HILL STREET拆成HILL和STREET,此时必须用短语查询关联词项,否则跨词的正则或通配符会失效。 - 优先选择短语通配符查询,相比正则查询性能更优,也更符合Solr的查询逻辑。
内容的提问来源于stack exchange,提问作者user2260040
相关产品推荐
相关产品推荐

