实现方案:
在spring容器初始化的时候 将数据库中数据查询出来 初始化到trie树结构中,并初始化创建trie对象,在service中编写方法,当页面输入单词时,发送请求到后台 后台接收之后,将词添加至树中,并直接按照输入的词 作为前缀进行搜索然后返回列表即可
1、导入依赖:
<dependency>
<groupId>com.github.takawitter</groupId>
<artifactId>trie4j</artifactId>
<version>0.9.8</version>
</dependency>
2、创建配置类:
@Configuration
public class ApAssociateWordsInitializingBean implements InitializingBean {
@Autowired
private ApAssociateWordsService apAssociateWordsService;
@Bean
public PatriciaTrie patriciaTrie(){
PatriciaTrie pat = new PatriciaTrie();
return pat;
}
@Autowired
private PatriciaTrie pat;
@Override
public void afterPropertiesSet() throws Exception {
List<ApAssociateWords> associateWordsList = apAssociateWordsService.list();
for (ApAssociateWords apAssociateWords : associateWordsList) {
pat.insert(apAssociateWords.getAssociateWords());
}
}
}
3、ServiceImpl实现类(controller 和service接口 略,自己定义就行):
@Autowired
private PatriciaTrie pat;
@Override
public List<String> searchByTrie(SearchDto dto) {
if (dto == null) {
throw new LeadNewsException(HttpCodeEnum.PARAM_REQUIRE.getCode(), HttpCodeEnum.PARAM_REQUIRE.getMessage());
}
Integer pageNum = dto.getPageNum();
Integer pageSize = dto.getPageSize();
if (pageNum == null || pageNum <= 0){
pageNum = 1;
}
if (pageSize == null || pageSize <= 0){
pageSize = 10;
}
String searchWords = dto.getSearchWords();
List<String> list = new ArrayList<>();
if (StringUtils.isNotEmpty(searchWords)) {
//前缀匹配
list = (List<String>)pat.predictiveSearch(searchWords);
if (list.size()>10){
return list.subList(0,10);
}
if (!pat.contains(searchWords)) {
pat.insert(searchWords);
}
}
return list;
}