SpringBoot整合ES,通过倒排索引搜索并高亮展示

介绍

在SpringBoot项目中,要通过ElasticSearch实现根据关键字搜索内容的功能。

快速开始。

导入依赖

 <!--elasticSearch场景启动器-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
 </dependency>
 <!-- elasticsearch客户端-->
 <dependency>
     <groupId>org.elasticsearch.client</groupId>
     <artifactId>transport</artifactId>
 </dependency>

配置文件

#****************************ElasticSearch********************
 elasticsearch:
    host:192.168.241.143
    port:9200

配置类

 @ConfigurationProperties(prefix = "elasticsearch")
 @Configuration
 public class ElasticSearchConfig {
     private String host;
     private int port;
 ​
     public String getHost() {return host;}
 ​
     public void setHost(String host) {this.host = host;}
 ​
     public int getPort() {return port;}
 ​
     public void setPort(int port) {this.port = port;}
     
     // ES客户端对象
     @Bean
     public RestHighLevelClient client(){
         HttpHost host = new HttpHost(getHost(),getPort(),"http");
         return new RestHighLevelClient(RestClient.builder(host));
     }
 }

向ES中添加数据

从mysql中查询数据,载添加到ElasticSearch中

List<Search> list = searchMapper.getNameId();

for (int i = 0; i < 107; i++) {
    Map<String, Object> data = new HashMap<>();
    data.put("name",list.get(i).getD_name());
    data.put("id",list.get(i).getD_id());
    System.out.println(data);
    IndexRequest indexRequest = new IndexRequest("hospital").id(String.valueOf(i+1)).source(data);
    client.index(indexRequest, RequestOptions.DEFAULT);
}

实现搜索并高亮

@Override
public String Search(String keyword) throws IOException {
    List<Map<String,Object>> list = new ArrayList<>();
    SearchRequest searchRequest = new SearchRequest("hospital");
    SearchSourceBuilder searchSource = new SearchSourceBuilder();
    TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", keyword);
    // 高亮
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    // 前后标签和加标签的字段
    highlightBuilder.preTags("<span style='color:red'>").postTags("</span>").field("name").requireFieldMatch(true);

    searchSource.highlighter(highlightBuilder);
    searchSource.query(termsQueryBuilder);
    searchRequest.source(searchSource);
    SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
    System.out.println(search);
    SearchHits hits = search.getHits();

    for (SearchHit hit : hits) {

        Map<String, HighlightField> highlightFields = hit.getHighlightFields();
        HighlightField title = highlightFields.get("name");
        Map<String,Object> sourceAsMap = hit.getSourceAsMap();  //没高亮的数据
        if(title != null){
            Text[] fragments = title.fragments();
            StringBuilder n_title = new StringBuilder();
            for (Text text : fragments) {
                n_title.append(text);
            }
            sourceAsMap.put("name", n_title.toString());   //把高亮字段替换掉原本的内容即可
        }
        list.add(sourceAsMap);
    }
    return JSON.toJSONString(list);
}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙域、白泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值