一、需求描述
项目开发中遇到需要对地址进行分词,然后根据关键词匹配区域的需求
二、解决方案
1、使用正则表达式匹配,只需维护一个关键词库
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document("t_order_address")
public class orderAddress {
private String id;
private String address;
}
地址数据表
具体实现代码用例:
@Test
void testtt(){
List<String> ikList = new ArrayList<>();
ikList.add("九龍");
ikList.add("新界");
ikList.add("木廠街");
ikList.add("宏业西街");
List<String> matchedList = new ArrayList<>();
orderAddress orderAddress = mongoTemplate.findOne(new Query(), orderAddress.class);
for (String s:ikList) {
Pattern compile = Pattern.compile(".*" + s + ".*", Pattern.CASE_INSENSITIVE);
boolean matches = compile.matcher(orderAddress.getAddress()).matches();
if (matches){
matchedList.add(s);
}
}
System.out.println(matchedList);
}
优点:代码实现快捷,数据维护方便。
缺点:每增加一个关键字,就要多增加一次关键词的正则匹配,影响匹配效率。
2、使用ES的Ik分词器对地址解析进行分词
ik分词器可以对地址根据添加关键词的日志直接进行分词,方便快捷。
优点:匹配效率最优,关键词表更加便于维护。
缺点:需要在项目中部署ES,以及IK分词器,并考虑与JDK版本兼容的问题。