SpringBoot+Elasticsearch-7.X实现高亮分词搜索

目录

一、服务端安装搭建

 二、SpringBoot服务搭建

1、依赖配置

2、搜索

3、高亮显示


对于基础应用包下载和安装流程,这里大体跳过。需要的可以参考比较老版本的搭建流程

SpringBoot+Mybatis+Elasticsearch-2.X实现高亮分词搜索

这里主要说下高版本7.X跟以前的版本的不同之处

参考借鉴文章:

springboot整合Elasticsearch7.6实现简单查询及高亮分词查询

一、服务端安装搭建

安装下载此处省略,详情可以参看老版本。

启动的时候,进入bin目录, 运行启动 elasticsearch.bat 

启动完成后,在浏览器输入 http://localhost:9200/

SpringBoot+Elasticsearch-7.X实现高亮分词搜索_第1张图片

 二、SpringBoot服务搭建

1、依赖配置

与2.X版本依赖不变,版本和配置变动。

7.X版本的配置:

spring:
  elasticsearch:
    rest:
      uris: http://localhost:9200
public class EsConfig {

//    @Value("${elasticsearch.url}")
//    private String elasticsearchUrl;

    public static final RequestOptions COMMON_OPTIONS;
    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        COMMON_OPTIONS = builder.build();
    }

    /**
     * 不使用默认配置路径信息,可以使用以下自定义
     * localhost:9200 写在配置文件中就可以了
     * @return
     */
//    @Bean
//    public RestHighLevelClient client() {
//        ClientConfiguration clientConfiguration = ClientConfiguration.builder()
//                .connectedTo(elasticsearchUrl)
//                .build();
//
//        return RestClients.create(clientConfiguration).rest();
//    }
}

2、搜索

实体类


@Document(indexName = "universa_question")
@Data
public class QuestionAnswer implements Serializable {

    @Id
    private String id;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String title;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String content;

}

对ES注解有疑惑的可以简易参考

spring data elasticsearch的 @Documnet 和 @Field 注解

ES注解详解

对应的ES和QuestionAnswer 的数据库连接方法实现类,依旧可参考老版本2.X文章的内容,这里不再二次梳理

3、高亮显示

这边文章主要也是为了介绍版本不同的高亮显示方式,直接上实现

需要注意:

以前的版本使用的是ElasticsearchRestTemplate客户端,新版本使用的是RestHighLevelClient


    @Autowired
    private RestHighLevelClient client;

    public Response> findAnswerByTitle2(String content) {

        List esProductTOS = new ArrayList<>();
        //1.构建检索条件
        SearchRequest searchRequest = new SearchRequest();
        //2.指定要检索的索引库(与实体类定义的索引库同个或是不指定)
        searchRequest.indices("universa_question");
        //3.指定检索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        sourceBuilder.query(QueryBuilders.multiMatchQuery(content, "content"));

        //4.结果高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.requireFieldMatch(true); //如果该属性中有多个关键字 则都高亮
        highlightBuilder.field("content");//这里配置的是“content”字段,如有多个,自行添加
        highlightBuilder.preTags("");//高亮模式
        highlightBuilder.postTags("");

        sourceBuilder.highlighter(highlightBuilder);
        searchRequest.source(sourceBuilder);
        SearchResponse response = null;
        try {
            response = client.search(searchRequest, EsConfig.COMMON_OPTIONS);
        } catch (IOException e) {
            e.printStackTrace();
        }
        org.elasticsearch.search.SearchHit[] hits = response.getHits().getHits();
        for (org.elasticsearch.search.SearchHit hit : hits) {
            //如果不做高亮,则可以直接转为json,然后转为对象
//            String value = hit.getSourceAsString();
//            ESProductTO esProductTO = JSON.parseObject(value, ESProductTO.class);
            //解析高亮字段
            //获取当前命中的对象的高亮的字段
            Map highlightFields = hit.getHighlightFields();
            log.info("json-hit: " + JSONObject.toJSONString(hit));


            //查询精确后的匹配分数值(可以用入参来进行判断做筛选过滤条件)
            float score = hit.getScore();
            log.info("hit score : " + score);


            HighlightField productName = highlightFields.get("content");
            String newName = "";
            if (productName != null) {
                //获取该高亮字段的高亮信息
                Text[] fragments = productName.getFragments();
                //将前缀、关键词、后缀进行拼接
                for (Text fragment : fragments) {
                    newName += fragment;
                }
            }
            Map sourceAsMap = hit.getSourceAsMap();
            //将高亮后的值替换掉旧值(这里就是高亮显示的部分)
            sourceAsMap.put("content", newName);
            String json = JSONObject.toJSONString(sourceAsMap);
            QuestionAnswer esProductTO = JSONObject.parseObject(json, QuestionAnswer.class);
            esProductTOS.add(esProductTO);
        }
        return Response.success(esProductTOS);
    }

你可能感兴趣的:(spring,elasticsearch,es)