后端多字段在一个搜索框下的模糊搜索实现
之前因为项目需求(虽然最后因为可能影响性能把这个功能砍掉了),记录一下。给有需要的人可以参考参考思路。这个牺牲了性能,数据量太多的话不建议使用。
我将数据库每条数据拿出来依次拼接,去除字段名称,形成一个大的字符串,通过用户输入的字段去匹配字段,形成了在一个搜索框下模糊搜索所有想搜索的字段功能,可以通过删减或增加从数据库提取出来的字段来进行模糊搜索的字段范围,代码贴在下面供参考。
mhsearch是前台传过来的搜索框输入的字符串,fw是用作query的查询
@Transactional(rollbackFor = Exception.class)
@Override
public IPage<EaPersonDto> pageSearch(FindWrapper<EaPersonVo> fw, String mhSearch) {
if (null != mhSearch) {
List<EaPersonDto> list = this.list();
List<Long> listUserId = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
String a = null;
if (null != list.get(i).getEaPersonVo().getName()) {
a = a + list.get(i).getEaPersonVo().getName().toString();
}
if (null != list.get(i).getEaPersonVo().getCard()) {
a = a + list.get(i).getEaPersonVo().getCard().toString();
}
if (null != list.get(i).getEaPersonVo().getMob()) {
a = a + list.get(i).getEaPersonVo().getMob().toString();
}
if (null != list.get(i).getEaPersonVo().getResponsibility()) {
if (0 == list.get(i).getEaPersonVo().getResponsibility()) {
a = a + "监考";
}
if (1 == list.get(i).getEaPersonVo().getResponsibility()) {
a = a + "巡考";
}
}
if (null != list.get(i).getEaPersonVo().getStatus()) {
a = a + list.get(i).getEaPersonVo().getStatus().toString();
}
if (null != list.get(i).getEaPersonVo().getType()) {
a = a + list.get(i).getEaPersonVo().getType().toString();
}
if (null != list.get(i).getEaPersonVo().getWork()) {
a = a + list.get(i).getEaPersonVo().getWork().toString();
}
if (null != list.get(i).getEaPersonVo().getHome()) {
a = a + list.get(i).getEaPersonVo().getHome().toString();
}
if (null != list.get(i).getEaPersonVo().getNbCard()) {
a = a + list.get(i).getEaPersonVo().getNbCard().toString();
}
a = a.replace(", name=", "");
a = a.replace(", card=", "");
a = a.replace(", mob=", "");
a = a.replace(", status=", "");
a = a.replace(", type=", "");
a = a.replace(", work=", "");
a = a.replace(", home=", "");
a = a.replace(", nbcard=", "");
if (a.indexOf(mhSearch) != -1) {
listUserId.add(list.get(i).getEaPersonVo().getUserId());
}
}
if (0 != listUserId.size()) {
fw.in("user_id", listUserId);
} else {
return null;
}
}
IPage<EaPersonDto> page = this.page(fw);
return page;
}
性能方面会有所影响,数据大的话搜索会比较慢,数据量不过几千条的话也看不出什么影响