Преглед изворни кода

暂时弃用高德请求,优化数据库数据匹配逻辑。

DESKTOP-6LTVLN7\Liumouren пре 2 месеци
родитељ
комит
11672d84e5

+ 8 - 10
src/main/java/com/skyversation/poiaddr/addquery/AddressQueryEngine.java

@@ -60,10 +60,7 @@ public class AddressQueryEngine {
 //                System.out.println("数据库查询有结果!!!!");
                 JSONArray pois = new JSONArray();
                 pois.addAll(dbPois);
-                addressResult = new TransfromDataTool().gdV3ResultToResult(addr, pois, false);// 只做格式转换,和多选一,就可以了
-
-
-//                if (addressResult != null && addressResult.getData() != null && addressResult.getData().size() > 0 && ifRuleData(addressResult.getData().get(0).getScore())) {
+                addressResult = new TransfromDataTool().gdV3ResultToResult(addr, pois, false);
                 if (addressResult != null && addressResult.getData() != null && addressResult.getData().size() > 0) {
                     addressResult.setCode(AddressResultEnum.GD_SUCCESS);
                     addressResult.setMessage("成功");
@@ -84,14 +81,15 @@ public class AddressQueryEngine {
         for (String addr : addrs) {
             //  创建请求
             addressResult = szxSearchByName(addr);
-            if (addressResult != null && addressResult.getData() != null && addressResult.getData().size() > 0 && ifRuleData(addressResult.getData().get(0).getScore())) {
+//          TODO 高德接口无法使用,市中心的接口请求成为了最后一道防线  && ifRuleData(addressResult.getData().get(0).getScore())
+            if (addressResult != null && addressResult.getData() != null && addressResult.getData().size() > 0) {
                 addressResult.setCode(AddressResultEnum.SZX_SUCCESS);
                 addressResult.setMessage("成功");
                 return getCjWgWgwByLoc(addressResult);
             }
         }
-//      TODO 如果多次尝试请求市中心地址后,还是请求失败就使用高德地名地址搜索
-        for (String addr : addrs) {
+//      TODO 如果多次尝试请求市中心地址后,还是请求失败就使用高德地名地址搜索,现在是到了上限,暂时不用
+        /*for (String addr : addrs) {
             //  创建请求(要返回对应的搜索地址,返回地址,总分,市:cityname,街道:adname,村居:community)
             addressResult = gdV3SearchByName(addr);
             if (addressResult != null && addressResult.getData() != null && addressResult.getData().size() > 0) {
@@ -99,7 +97,7 @@ public class AddressQueryEngine {
                 addressResult.setMessage("成功");
                 return getCjWgWgwByLoc(addressResult);
             }
-        }
+        }*/
         addressResult.setCode(AddressResultEnum.RESULT_NULL);
         addressResult.setMessage("失败");
         return addressResult;
@@ -311,7 +309,7 @@ public class AddressQueryEngine {
      * @return
      */
     public AddressResult gdSearchByName(String address) {
-        String geoUrl = Constant.AMAP_GEO_URL + "?key=" + Constant.AMAP_KEY[ThreadLocalRandom.current().nextInt(0, 3)] + "&address=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&output=JSON";
+        String geoUrl = Constant.AMAP_GEO_URL + "?key=" + Constant.AMAP_KEY[ThreadLocalRandom.current().nextInt(0, 4)] + "&address=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&output=JSON";
         ResponseEntity response = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.GET, geoUrl, null, null, 0);
         if (response != null && response.getBody() != null) {
             String body = response.getBody() + "";
@@ -341,7 +339,7 @@ public class AddressQueryEngine {
         JSONArray pois = new JSONArray();
         ScheduledTasks.gdRequestSize++;
         String geoUrl =
-                Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY[ThreadLocalRandom.current().nextInt(0, 3)] + "&types=" + Constant.AMAP_SEARCH_TYPES +
+                Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY[ThreadLocalRandom.current().nextInt(0, 4)] + "&types=" + Constant.AMAP_SEARCH_TYPES +
                         "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20";
         ResponseEntity responseEntity = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.GET, geoUrl, null, null, 0);
         if (responseEntity.hasBody()) {

+ 2 - 2
src/main/java/com/skyversation/poiaddr/addquery/Constant.java

@@ -79,8 +79,8 @@ public class Constant {
             "|100000|110000|120000|130000|140000|150000|160000|170000|180000|190000|200000|220000|970000|980000|990000";
 
     //    public static String AMAP_KEY = "38511ab3763ab97a10bd68ad8210933d";
-//    public static String AMAP_KEY = "28f736e6421ff3577280bdca9a0ce1d9"; a91ac5c3dc208259d8a3ac971f2c2529
-    public static String[] AMAP_KEY = new String[]{"7a68ed576a6e2539c53b172e735cf342", "50ab96b1297395c29216150c4284704b", "2e1fa082d655f41d4643acc997709c02"};
+//    public static String AMAP_KEY = "28f736e6421ff3577280bdca9a0ce1d9";
+    public static String[] AMAP_KEY = new String[]{"a91ac5c3dc208259d8a3ac971f2c2529", "7a68ed576a6e2539c53b172e735cf342", "50ab96b1297395c29216150c4284704b", "2e1fa082d655f41d4643acc997709c02"};
     //    oauth和dms搭建服务器地址
     public static String ServerBaseUrl = "http://121.43.55.7:";
     //    DMS服务端口和路径

+ 7 - 3
src/main/java/com/skyversation/poiaddr/addquery/TransfromDataTool.java

@@ -242,16 +242,20 @@ public class TransfromDataTool {
 
     public AddressResult gdV3ResultToResult(String searchAddress, JSONArray array, boolean isInserted) {
         AddressResult result = new AddressResult();
-
         try {
             if (array == null || array.size() < 1) {
                 result.setCode(AddressResultEnum.RESULT_NULL);
                 return result;
             }
-            JSONObject jsonObject = com.skyversation.poiaddr.util.AddressTools.getInstance().findBestMatch(searchAddress, array, "address");
+            JSONObject jsonObject = com.skyversation.poiaddr.util.AddressTools.getInstance().findBestMatch2(searchAddress, array, "address");
             if (jsonObject != null && jsonObject.containsKey("总分") && jsonObject.get("总分") != null && !jsonObject.getString("总分").isEmpty()) {
                 AddressResult.ContentBean content = new AddressResult.ContentBean();
-                content.setScore(jsonObject.getString("总分"));
+                if(jsonObject.getString("总分").contains("rule_")){
+                    content.setScore(jsonObject.getString("总分"));
+                }else{
+//                  TODO 添加规则:rule_3,代表数据库中匹配到的数据,但是不属于rule_4和rule_2的第三种规则
+                    content.setScore("rule_3");
+                }
                 content.setSearchAddress(jsonObject.getString("searchAddress"));
                 content.setPname(jsonObject.getString("pname"));
                 content.setCityname(jsonObject.getString("adname"));

+ 2 - 1
src/main/java/com/skyversation/poiaddr/service/AreaService.java

@@ -29,6 +29,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 @Service
 public class AreaService {
@@ -40,7 +41,7 @@ public class AreaService {
     private AmapAddressV3Service amapAddressV3Service;
 
     //  暂存数据库中的所有数据
-    private Map<String, AmapAddressV3> allAddressData = new HashMap<>();
+    private Map<String, AmapAddressV3> allAddressData = new ConcurrentHashMap<>();
 
     private static AreaService instance;
 

+ 84 - 0
src/main/java/com/skyversation/poiaddr/util/AddressTools.java

@@ -488,6 +488,90 @@ public class AddressTools {
         return result;
     }
 
+    /**
+     * 只匹配数字
+     * @param address
+     * @param array
+     * @param param
+     * @return
+     */
+    public JSONObject findBestMatch2(String address, JSONArray array, String param) {
+        JSONObject bestMatch = null;
+        double maxTotalScore = 0;
+        // 处理输入地址的分词和数字前文本
+        AddressInfo addressInfo = processAddress(address);
+        for (int i = 0; i < array.size(); i++) {
+            JSONObject obj = array.getJSONObject(i);
+            obj.put("searchAddress", address);
+//            && obj.getString(param).contains(Constant.getArea())
+            if (obj.containsKey(param) && obj.get(param) != null && !obj.getString(param).trim().isEmpty()) {
+//              得到返回的地址
+                String addr = obj.getString(param);
+//              规则4判断
+//              TODO 添加校验逻辑(首先使用第4校验规则匹配,匹配不到使用第二规则,还匹配不到的话就使用打分规则)
+                Set<String> addressString = AddressQueryEngine.tokenizeString(AddressQueryEngine.townReplaceAll(addr)).get(0);
+                Set<String> addressNumber = AddressQueryEngine.tokenizeString(AddressQueryEngine.townReplaceAll(addr)).get(1);
+                Set<String> address2String = AddressQueryEngine.tokenizeString(AddressQueryEngine.townReplaceAll(address)).get(0);
+                Set<String> address2Number = AddressQueryEngine.tokenizeString(AddressQueryEngine.townReplaceAll(address)).get(1);
+                if (addressString != null && addressString.size() > 0) {
+                    int addressStrSize = addressString.size();
+                    for (String addr2str : address2String) {
+                        if (addressString.contains(addr2str)) {
+                            addressStrSize--;
+                            if (addressStrSize == 0) {
+                                if (addressNumber.size() == 0) {
+                                    obj.put("总分", "rule_4");
+                                    return obj;
+                                } else {
+                                    int addressNumSize = addressNumber.size();
+                                    for (String addr2Num : address2Number) {
+                                        if (addressNumber.contains(addr2Num)) {
+                                            addressNumSize--;
+                                            if (addressNumSize == 0) {
+                                                obj.put("总分", "rule_4");
+                                                return obj;
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+//              规则2判断
+                String role2address = AddressQueryEngine.townReplaceAll(AddressQueryEngine.addressReplaceAll(addr));
+                String role2address2 = AddressQueryEngine.townReplaceAll(AddressQueryEngine.addressReplaceAll(address));
+                if (AddressQueryEngine.isNotEmptyOrBlank(role2address) && role2address.contains(role2address2)) {
+                    obj.put("总分", "rule_2");
+                    return obj;
+                }
+
+                AddressInfo addrInfo = processAddress(addr);
+
+                // 第一步:全词匹配比例
+                double score1 = calculateFullWordMatchScore(address, addr);
+
+                // 第二步:数字匹配得分
+                double score2 = calculateNumberMatchScore(addressInfo.firstNumber, addrInfo.firstNumber);
+
+                // 第三步:数字前文本匹配得分
+                double score3 = calculatePrefixTextMatchScore(addressInfo.prefixText, addrInfo.prefixText);
+
+                double totalScore = score1 + score2 + score3;
+
+                if (score2 == 1 && totalScore > maxTotalScore) {
+                    maxTotalScore = totalScore;
+                    bestMatch = obj;
+                    bestMatch.put("计分1", score1);
+                    bestMatch.put("计分2", score2);
+                    bestMatch.put("计分3", score3);
+                    bestMatch.put("总分", totalScore);
+                }
+            }
+        }
+        return bestMatch;
+    }
+
     /***
      * 获取array中,指定字段与address匹配值最高的数据,特定方法,指定的jsonarray使用
      * 数据结果准不准主要看这个方法