文本地址智能识别组件(二)

前言

前面我们提到过文本地址智能识别组件的暴力解析方式,直接如何强行匹配地址信息,但是这种方式很难维护.这次我们通过别的方式去实现地址识别的功能,达到和数据库实时同步,并且自动补全的功能,当我们地址里面输入湖南省岳麓区时自动匹配长沙市,但输入长沙市岳麓区时,自动匹配出湖南省,达到实际需求中真正的智能识别文本地址信息

方案

大概的思路是数据库中存在想对应的省市区三级甚至四级的数据,没有数据可以自行去网上下载一份导入数据库,相关的数据操作按钮功能我就不一一描述了,我们通过数据库地址的级别功能找到对应的关联关系,通过连表查询出对应的上下级地址名称,然后把相关的值传进来返回对应的地址信息再处理相关的业务,可能数据结构和业务逻辑不一样,这就需要自行处理了.

首先我们查询对应的参考数据
查询的地址结果
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(
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智能识别收货地址Java import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Encoder; class Demo { public static String calcAuthorization(String source, String secretId, String secretKey, String datetime) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException { String signStr = "x-date: " + datetime + "\n" + "x-source: " + source; Mac mac = Mac.getInstance("HmacSHA1"); Key sKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), mac.getAlgorithm()); mac.init(sKey); byte[] hash = mac.doFinal(signStr.getBytes("UTF-8")); String sig = new BASE64Encoder().encode(hash); String auth = "hmac id=\"" + secretId + "\", algorithm=\"hmac-sha1\", headers=\"x-date x-source\", signature=\"" + sig + "\""; return auth; } public static String urlencode(Map<?, ?> map) throws UnsupportedEncodingException { StringBuilder sb = new StringBuilder(); for (Map.Entry<?, ?> entry : map.entrySet()) { if (sb.length() > 0) { sb.append("&"); } sb.append(String.format("%s=%s", URLEncoder.encode(entry.getKey().toString(), "UTF-8"), URLEncoder.encode(entry.getValue().toString(), "UTF-8") )); } return sb.toString(); } public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException { //云市场分配的密钥Id String secretId = "xxxx"; //云市场分配的密钥Key String secretKey = "xxxx"; String source = "market"; Calendar cd = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Lo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值