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

介绍

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

快速开始。

导入依赖

 
 
     org.springframework.boot
     spring-boot-starter-data-elasticsearch
 
 
 
     org.elasticsearch.client
     transport
 

配置文件

#****************************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 list = searchMapper.getNameId();

for (int i = 0; i < 107; i++) {
    Map 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> list = new ArrayList<>();
    SearchRequest searchRequest = new SearchRequest("hospital");
    SearchSourceBuilder searchSource = new SearchSourceBuilder();
    TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", keyword);
    // 高亮
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    // 前后标签和加标签的字段
    highlightBuilder.preTags("").postTags("").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 highlightFields = hit.getHighlightFields();
        HighlightField title = highlightFields.get("name");
        Map 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);
}

你可能感兴趣的:(SpringBoot,ElasticSearch,java,elasticsearch)