Browse Source

调整搜索等级判断逻辑(待测试)

DESKTOP-6LTVLN7\Liumouren 1 month ago
parent
commit
c6c0ad8af9

+ 90 - 21
src/main/java/com/skyversation/poiaddr/addquery/AddressQueryEngine.java

@@ -13,7 +13,9 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -316,10 +318,18 @@ public class AddressQueryEngine {
                 if (result != null && result.getData() != null && result.getData().size() > 0) {
                     List<AddressResult.ContentBean> contentBean = result.getData();
                     for (AddressResult.ContentBean contentBean1 : contentBean) {
-                        String address = extractNumbers(contentBean1.getAddress(), false);
-                        String address2 = extractNumbers(addr, false);
-                        if (isNotEmptyOrBlank(address) && address.contains(address2) || address2.contains(address)) {
-                            return contentBean1;
+                        Set<String> address = tokenizeString(contentBean1.getAddress()).get(1);
+                        if (address != null && address.size() > 1) {
+                            Set<String> address2 = tokenizeString(addr).get(1);
+                            int addressSize = address.size();
+                            for (String addr2 : address2) {
+                                if (address.contains(addr2)) {
+                                    addressSize--;
+                                    if (addressSize == 0) {
+                                        return contentBean1;
+                                    }
+                                }
+                            }
                         }
                     }
                 } else {
@@ -331,12 +341,28 @@ public class AddressQueryEngine {
                 if (result != null && result.getData() != null && result.getData().size() > 0) {
                     List<AddressResult.ContentBean> contentBean = result.getData();
                     for (AddressResult.ContentBean contentBean1 : contentBean) {
-                        String address = extractNumbers(addressReplaceAll(contentBean1.getAddress()), true);
-                        String address2 = extractNumbers(addressReplaceAll(addr), true);
-                        String addressNumber = extractNumbers(contentBean1.getAddress(), false);
-                        String addressNumber2 = extractNumbers(addr, false);
-                        if (isNotEmptyOrBlank(address) && (address.contains(address2) || address2.contains(address)) && (addressNumber.contains(addressNumber2) || addressNumber2.contains(addressNumber))) {
-                            return contentBean1;
+                        Set<String> addressString = tokenizeString(contentBean1.getAddress()).get(0);
+                        Set<String> addressNumber = tokenizeString(contentBean1.getAddress()).get(1);
+                        Set<String> address2String = tokenizeString(addr).get(0);
+                        Set<String> address2Number = tokenizeString(addr).get(1);
+                        if (addressString != null && addressString.size() > 1) {
+                            int addressStrSize = addressString.size();
+                            for (String addr2str : address2String) {
+                                if (addressString.contains(addr2str)) {
+                                    addressStrSize--;
+                                    if (addressStrSize == 0) {
+                                        int addressNumSize = addressNumber.size();
+                                        for (String addr2Num : address2Number) {
+                                            if (addressNumber.contains(addr2Num)) {
+                                                addressNumSize--;
+                                                if (addressNumSize == 0) {
+                                                    return contentBean1;
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
                         }
                     }
                 } else {
@@ -368,22 +394,65 @@ public class AddressQueryEngine {
         return address.replaceAll("上海市", "").replaceAll(Constant.getArea(), "").replaceAll("区", "").replaceAll("-", "").replaceAll("_", "").replaceAll("/", "").replaceAll(" ", "").replaceAll(",", "").replaceAll("\\.", "").replaceAll(",", "").replaceAll("。", "").replaceAll("\\+", "").replaceAll("\\*", "");
     }
 
+    public static String townReplaceAll(String address) {
+        String[] towns = Constant.getTowns();
+        for (String town : towns) {
+            address.replaceAll(town, "");
+        }
+        return address.replaceAll("号", "0").replaceAll("弄", "0").replaceAll("室", "0").replaceAll("户", "0").replaceAll("单元", "0").replaceAll("幢", "0");
+    }
+
     /**
-     * 得到字符串中所有的数字
+     * 数字和文字分词返回List<Set<String>>
      *
      * @param input
      * @return
      */
-    public static String extractNumbers(String input, boolean ifString) {
-        // 定义正则表达式,用于匹配一个或多个数字
-        Pattern pattern = Pattern.compile(ifString ? "\\D+" : "\\d+");
-        Matcher matcher = pattern.matcher(input);
-        String out = "";
-        // 查找所有匹配的数字
-        while (matcher.find()) {
-            out += matcher.group();
+    public static List<Set<String>> tokenizeString(String input) {
+        input = townReplaceAll(input);
+        // 初始化两个集合,一个用于存储非数字字符串,一个用于存储数字字符串
+        Set<String> nonNumberSet = new HashSet<>();
+        Set<String> numberSet = new HashSet<>();
+
+        StringBuilder currentToken = new StringBuilder();
+
+        for (int i = 0; i < input.length(); i++) {
+            char c = input.charAt(i);
+            if (Character.isDigit(c)) {
+                // 如果当前字符是数字
+                if (currentToken.length() > 0 && !Character.isDigit(currentToken.charAt(0))) {
+                    // 如果之前的 token 是非数字,将其添加到非数字集合中
+                    nonNumberSet.add(currentToken.toString());
+                    currentToken.setLength(0);
+                }
+                currentToken.append(c);
+            } else {
+                // 如果当前字符不是数字
+                if (currentToken.length() > 0 && Character.isDigit(currentToken.charAt(0))) {
+                    // 如果之前的 token 是数字,将其添加到数字集合中
+                    numberSet.add(currentToken.toString());
+                    currentToken.setLength(0);
+                }
+                if (!Character.isWhitespace(c)) {
+                    currentToken.append(c);
+                }
+            }
+        }
+
+        // 处理最后一个 token
+        if (currentToken.length() > 0) {
+            if (Character.isDigit(currentToken.charAt(0))) {
+                numberSet.add(currentToken.toString());
+            } else {
+                nonNumberSet.add(currentToken.toString());
+            }
         }
-        return out;
-    }
 
+        // 将两个集合添加到列表中
+        List<Set<String>> result = new ArrayList<>();
+        result.add(nonNumberSet);
+        result.add(numberSet);
+
+        return result;
+    }
 }

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

@@ -19,6 +19,16 @@ public class Constant {
     //    TODO 青浦区行政区划编码:310118 松江区行政区划编码:310117
     private String area;
 
+    private String[] towns;
+
+    public static void setTowns(String[] town){
+        getInstance().towns = town;
+    }
+
+    public static String[] getTowns(){
+        return getInstance().towns;
+    }
+
     public static void setArea(String area){
         getInstance().area = area;
     }

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

@@ -47,9 +47,12 @@ public class AreaService {
         return instance;
     }
 
-    @Value("${app.area:青浦}")
+    @Value("${app.area}")
     private String area;
 
+    @Value("${app.town}")
+    private String town;
+
     WKTReader reader = new WKTReader(JTSFactoryFinder.getGeometryFactory());
     List<JSONObject> featureList = new ArrayList<>();
     List<Village> propertiList = new ArrayList<>();
@@ -86,6 +89,7 @@ public class AreaService {
         }
 //      TODO 初始化tableA、tableB
         /*testTablesService.testData();*/
+        Constant.setTowns(town.split("、"));
         Constant.setArea(area);
         System.out.println("<<<<<<<<------根据配置文件为AREA赋值:" + Constant.getArea());
         System.out.println("<<<<<<<<------当前AMAP_CITY_CODE:" + Constant.getAMAP_CITY_CODE());

+ 6 - 2
src/main/resources/application.properties

@@ -10,5 +10,9 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 # JPA
 spring.jpa.hibernate.ddl-auto=update
 spring.jpa.show-sql=false
-# \u533A\u57DF
-app.area=\u677E\u6C5F
+# \u677E\u6C5F\u8857\u9547
+app.area=\u677E\u6C5F
+app.town=\u5CB3\u9633\u8857\u9053\u3001\u6C38\u4E30\u8857\u9053\u3001\u65B9\u677E\u8857\u9053\u3001\u4E2D\u5C71\u8857\u9053\u3001\u5E7F\u5BCC\u6797\u8857\u9053\u3001\u4E5D\u91CC\u4EAD\u8857\u9053\u3001\u6CD7\u6CFE\u9547\u3001\u4F58\u5C71\u9547\u3001\u8F66\u58A9\u9547\u3001\u65B0\u6865\u9547\u3001\u6D1E\u6CFE\u9547\u3001\u4E5D\u4EAD\u9547\u3001\u6CD6\u6E2F\u9547\u3001\u77F3\u6E56\u8361\u9547\u3001\u65B0\u6D5C\u9547\u3001\u53F6\u69AD\u9547\u3001\u5C0F\u6606\u5C71\u9547
+# \u9752\u6D66\u8857\u9547
+#app.area=\u9752\u6D66
+#app.town2=\u6731\u5BB6\u89D2\u9547\u3001\u8D75\u5DF7\u9547\u3001\u5F90\u6CFE\u9547\u3001\u534E\u65B0\u9547\u3001\u91CD\u56FA\u9547\u3001\u767D\u9E64\u9547\u3001\u7EC3\u5858\u9547\u3001\u91D1\u6CFD\u9547\u3001\u590F\u9633\u8857\u9053\u3001\u76C8\u6D66\u8857\u9053\u3001\u9999\u82B1\u6865\u8857\u9053