介绍
在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);
}