您好,欢迎来到宝玛科技网。
搜索
您的当前位置:首页java8+springboot + HanLP分词+实现全文模糊检索

java8+springboot + HanLP分词+实现全文模糊检索

来源:宝玛科技网


前言

前端传递文本,后端对文本处理后进行模糊检索

一、使用到的组件

1.HanLP-分词

二、使用步骤

1.前端传递文本

例如传递内容如下

{multiQuery: 我需要自定义检索信息}

2.后端处理

        /**
         * 模糊查找处理
         *
         * */
        String  getMultiQuery = testInfo.getMultiQuery();
        //分词数组
        List<String> termsB = new ArrayList<>();
        //分词处理
        List<Term> termsA = HanLP.segment(getMultiQuery);
        //拼接
          List<Term> termsA = HanLP.segment(getMultiQuery);
       termsB = termsA.stream() .map(term -> term.word).collect(Collectors.toList());   

如果需要限定分词可参照:

   CustomDictionary.add(searchHit,"5000"); // 添加到 CustomDictionary

继续

       // 构建 LIKE 查询-过度分散
       String sql = "("+buildSearchQuery(termsB)+")";

like构建的函数

   private String buildSearchQuery(List<String> terms) {
        /**
         * 名称
         * 编号
         * */
         * 
        StringJoiner likeConditions = new StringJoiner(" OR ");//或
        /**
        *此处的字段名需要和数据库一致
			*/
        for (String term : terms) {
            likeConditions.add("name LIKE '%" + term + "%'")
                    .add("code LIKE '%" + term + "%'");
        }

        return likeConditions.toString();
    }

在mapper中:

         <if test="multiQuery != null  and multiQuery != ''" > and
                <foreach collection="terms" item="term" separator=" OR ">
                    (name LIKE CONCAT('%', #{term}, '%')
                    OR code LIKE CONCAT('%', #{term}, '%')
                </foreach>
        </if>

这样就可以得到需求的数组。

3.高亮处理

是通过添加,<span> 标签将匹配到的文本包裹,以实现高亮

<span style='color:red;'>" + term + "</span>"

1.设置变化文本

    /**
     * 用 <span> 标签将匹配到的文本包裹,以实现高亮
     */
    private String highlightText(String text, String term) {
        if (StringUtils.isEmpty(text)){
            return text;
        }
        return text.replaceAll("(?i)" + term, "<span style='color:red;'>" + term + "</span>");
    }

2.接口

 OaReportInformation a = (OaReportInformation)highlightResult(result, finalTermsB,length);

3.方法

  /**
     * 对查询结果进行高亮处理
     * 将匹配的分词加上 <span> 标签,用于 HTML 显示
     */
    private Object highlightResult(Object result, List<String> terms, AtomicReference<Integer> length) {
        for (String term : terms) {
            Field[] fields = result.getClass().getDeclaredFields();
            for (Field field : fields) {
                // 设置可以访问私有字段
                field.setAccessible(true);
                try {
                    Object value = field.get(result);
                    if (value != null && value instanceof String) {
                        // 对String类型的字段进行高亮处理
                        String highlightedValue = highlightText((String) value, term);
                        length.set(length.get() + this.calculateHighlightedLength(highlightedValue)); // 或者根据实际需要进行相应的修改
                        field.set(result, highlightedValue);
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

总结

实现文本高亮

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baomayou.com 版权所有 赣ICP备2024042794号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务