前言
前面我们提到过文本地址智能识别组件的暴力解析方式,直接如何强行匹配地址信息,但是这种方式很难维护.这次我们通过别的方式去实现地址识别的功能,达到和数据库实时同步,并且自动补全的功能,当我们地址里面输入湖南省岳麓区时自动匹配长沙市,但输入长沙市岳麓区时,自动匹配出湖南省,达到实际需求中真正的智能识别文本地址信息
方案
大概的思路是数据库中存在想对应的省市区三级甚至四级的数据,没有数据可以自行去网上下载一份导入数据库,相关的数据操作按钮功能我就不一一描述了,我们通过数据库地址的级别功能找到对应的关联关系,通过连表查询出对应的上下级地址名称,然后把相关的值传进来返回对应的地址信息再处理相关的业务,可能数据结构和业务逻辑不一样,这就需要自行处理了.
首先我们查询对应的参考数据
SQL如下
SELECT * FROM kd_region WHERE region_name = '北京市'
UNION
SELECT * FROM kd_region WHERE region_parent_id = '110000'
UNION
SELECT * FROM kd_region WHERE region_parent_id = '110100'
如上可看出数据库的地址表数据结构是有region_id(地址ID)和region_parent_id(父级ID),region_type(1省,2市,3区,4街道)这些关键信息所组成.
编写匹配地址业务SQL
SELECT
t2.province_code provinceCode,
t2.province_name province,
t2.city_name city,
t2.county_name county
FROM
((
SELECT
r.region_id province_code,
r.region_name province_name,
r1.region_name city_name,
r2.region_name county_name
FROM
kd_region r
LEFT JOIN kd_region r1 ON r.region_id = r1.region_parent_id AND
r1.region_type = 2 AND r1.is_del = 0
LEFT JOIN kd_region r2 ON r1.region_id = r2.region_parent_id AND r2.is_del
= 0
WHERE
r.region_type = 1 AND r.is_del= 0
) ) t2 WHERE
(
INSTR('湖南省岳麓区XX路XX区',t2.province_name)
OR
INSTR('湖南省岳麓区XX路XX区',t2.city_name)
)
AND INSTR('湖南省岳麓区XX路XX区',t2.county_name)
通过关联地址表的父级ID查询出三级菜单,由于我们的地址有些是直辖市自治县这种特殊地址,所以关联第三级的时候我们的地址级别只要不为1或者2都可以,不然会导致部分特殊地址丢失的情况.
由于地址会自动找出丢失的第一级或者第二级,当出现重名的地址时,可以考虑随时获取识别到的地址
具体业务处理
/**
* 识别相关信息:QQ1025032391
* @param request
* @return
*/
@RequestMapping(