模糊查询搜索相似度这类问题建议使用ElasticSearch来实现,用原生sql的case when来写效率很低。
话虽如此,但这里也记录一下吧。
代码
mapper.xml
<select id="search" resultType="com.daanchakan.site.entity.Answer" parameterType="list">
select *,
<foreach item="item" collection="chars" separator="+" open="(" close=")" index="">
(case when question_content like CONCAT('%',#{item},'%') then 1 else 0 end)
</foreach>
as num from answer having num > 1 order by num DESC
</select>
mapper.java
@Mapper
public interface AnswerMapper extends BaseMapper<Answer> {
Page<Answer> search(Page page, char[] chars);
}
service.java
@Service
public class AnswerServiceImpl extends ServiceImpl<AnswerMapper, Answer> implements AnswerService {
@Override
public Page<Answer> search(Integer pn, Integer size, String question) {
Page<Answer> page = new Page<>();
page.setCurrent(pn);
page.setSize(size);
char[] chars = question.toCharArray();
this.baseMapper.search(page, chars);
return page;
}
}
理解
首先在impl实现层把传过来的字符串格式的搜索条件进行一个格式转换 转换成数组
char[] chars = question.toCharArray();
然后在mybatis里面进行一个foreach循环遍历
在这里使用了mysql的CASE WHEN 关键字,当模糊查询搜索到的时候就赋个值为1没有搜索到则是0,以此相加。最后where条件里面加个判断,查询结果>1的就ok了。
思路来源于:
记mysql使用case when实现模糊查询搜索相似度达三个字以上_qq_40907536的博客-CSDN博客_mysql相似度模糊搜索