0
点赞
收藏
分享

微信扫一扫

mybatis使用case when实现模糊查询搜索相似度

生命中最美的是成长 2022-02-03 阅读 63

模糊查询搜索相似度这类问题建议使用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相似度模糊搜索

举报

相关推荐

0 条评论