“咱们老百姓,今天真高兴儿”,今天为大家分享Elasticsearch的企业应用实战课程啦,经过前三节课的ES安装、中文分词器安装、Kibana安装以及常见命令的了解之后,我们就开始用前面所学的东西开始实战了,你说开心不开心呢!
大家好,我是小艾同学(一位可甜、可萌、可温柔、可暴力的程序员鼓励师
)接下来我们正式课程开始了,在开始之前呢,我先带着大家看看艾编程官网的搜索页面吧!
温馨提示:以上显示的域名是展示域名,非访问域名,艾编程官网地址www.icodingedu.com
正式课程精彩开始
Elasticsearch企业应用实战
es项目实战案例-艾编程官网课程搜索实战开发
7.1SpringBoot整合ES
7.1.1pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>2.0.1.RELEASEversion> parent> <groupId>icoding-searchgroupId> <artifactId>com.icodingartifactId> <version>1.0-SNAPSHOTversion> <properties> <java.version>1.8java.version> <tomcat.version>8.5.28tomcat.version> <springframework.version>5.0.5.RELEASEspringframework.version> properties> <dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>org.elasticsearch.clientgroupId> <artifactId>elasticsearch-rest-high-level-clientartifactId> <version>7.4.0version> <exclusions> <exclusion> <groupId>org.elasticsearchgroupId> <artifactId>elasticsearchartifactId> exclusion> <exclusion> <groupId>org.elasticsearch.clientgroupId> <artifactId>elasticsearch-rest-clientartifactId> exclusion> exclusions> dependency> <dependency> <groupId>org.elasticsearch.clientgroupId> <artifactId>elasticsearch-rest-clientartifactId> <version>7.4.0version> dependency> <dependency> <groupId>org.elasticsearchgroupId> <artifactId>elasticsearchartifactId> <version>7.4.0version> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>fastjsonartifactId> <version>1.2.30version> dependency> <dependency> <groupId>org.apache.commonsgroupId> <artifactId>commons-lang3artifactId> <version>3.6version> dependency> <dependency> <groupId>org.projectlombokgroupId> <artifactId>lombokartifactId> <version>1.16.16version> dependency> dependencies>project>
7.1.2 创建主启动类和application.yml
package com.icoding;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class SearchApplication { public static void main(String[] args) { SpringApplication.run(SearchApplication.class, args); }}
icoding: es: hostname: 192.168.200.130:9200 #多个结点中间用逗号分隔 course: index: icoding_course field: id,name,pic
7.1.3添加实体类
新建包 domain
7.1.4创建配置类
新建包config
新建配置类 ElasticsearchConfig
package com.icoding.config;import org.apache.http.HttpHost;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestHighLevelClient;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @create 2020-04-03 15:11 */@Configurationpublic class ElasticsearchConfig { @Value("${icoding.es.hostname}") private String hostlist; @Bean public RestHighLevelClient restHighLevelClient(){ //解析hostlist配置信息 String[] split = hostlist.split(","); //创建HttpHost数组,其中存放es主机和端口的配置信息 HttpHost[] httpHostArray = new HttpHost[split.length]; for(int i=0;i<split.length;i++){ String item = split[i]; httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http"); } //创建RestHighLevelClient客户端 return new RestHighLevelClient(RestClient.builder(httpHostArray)); }}
7.1.5 测试
com.icoding.search.TestIndex
1.获取连接
2.创建请求对象
3.发起请求,带到响应对象
4.拿到响应结果
5.处理结果
package com.icoding.search;import org.elasticsearch.action.admin.indices.create.CreateIndexAction;import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;import org.elasticsearch.client.IndicesClient;import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.xcontent.XContentType;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;/** * @author 何方勇 * @create 2020-04-04 21:31 */@SpringBootTest@RunWith(SpringRunner.class)public class TestIndex { @Autowired RestHighLevelClient client; @Test public void testCreateIndex() throws IOException { //1.获取连接 IndicesClient indices = client.indices(); //2.创建请求对象 CreateIndexRequest createIndexRequest = new CreateIndexRequest("icoding_course_04"); //3.发起请求,获取相应对象 CreateIndexResponse createIndexResponse = indices.create(createIndexRequest, RequestOptions.DEFAULT); //4.获取结果 boolean iftrue = createIndexResponse.isAcknowledged(); //5.打印结果 System.out.println(iftrue); }}
7.2课程搜索功能实现
创建业务层:service.EsCourseService
1.创建请求对象
2.发起请求,带到响应对象
3.处理响应结果
4.返回结果集
package com.icoding.service;import com.icoding.domain.*;import org.apache.commons.lang3.StringUtils;import org.elasticsearch.action.search.SearchRequest;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.common.text.Text;import org.elasticsearch.index.query.BoolQueryBuilder;import org.elasticsearch.index.query.MultiMatchQueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.search.SearchHit;import org.elasticsearch.search.SearchHits;import org.elasticsearch.search.builder.SearchSourceBuilder;import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Map;/** * @author 何方勇 * @create 2020-04-03 15:28 */@Servicepublic class EsCourseService { @Value("${icoding.course.index}") private String index; @Value("${icoding.course.source_field}") private String source_field; @Autowired RestHighLevelClient restHighLevelClient; //课程搜索 public QueryResponseResult<Course> list(int page, int size, CourseSearchParam courseSearchParam) { //创建搜索请求对象 SearchRequest searchRequest = new SearchRequest(index); //构建搜索源对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //过虑源字段 String[] source_field_array = source_field.split(","); //设置源字段 searchSourceBuilder.fetchSource(source_field_array,new String[]{}); //将搜索源对象设置到请求对象中 searchRequest.source(searchSourceBuilder); //返回分页结果 QueryResult<Course> queryResult = new QueryResult(); //数据列表 List<Course> list = new ArrayList<>(); try { //执行搜索 SearchResponse searchResponse = restHighLevelClient.search(searchRequest); //获取响应结果 SearchHits hits = searchResponse.getHits(); //匹配的总记录数 long totalHits = hits.totalHits; queryResult.setTotal(totalHits); //获取匹配到的结果数据 SearchHit[] searchHits = hits.getHits(); //取出结果数据封装到对象中 for(SearchHit hit:searchHits){ Course course = new Course(); //源文档 Map<String, Object> sourceAsMap = hit.getSourceAsMap(); //取出id String id = (String)sourceAsMap.get("id"); course.setId(id); //取出name String name = (String) sourceAsMap.get("name"); //图片 String pic = (String) sourceAsMap.get("pic"); course.setPic(pic); //将coursePub对象放入list list.add(course); } } catch (IOException e) { e.printStackTrace(); } queryResult.setList(list); QueryResponseResult<Course> queryResponseResult = new QueryResponseResult<Course>(CommonCode.SUCCESS,queryResult); return queryResponseResult; }}
测试代码:
@Testpublic void testCourseList() throws IOException { CourseSearchParam courseSearchParam = new CourseSearchParam(); QueryResponseResult queryResponseResult = esCourseService.list(1,10,courseSearchParam); Listlist = queryResponseResult.getQueryResult().getList(); System.out.println(list);}
7.2.1按关键字搜索
//创建布尔查询对象BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//搜索条件//根据关键字搜索if(StringUtils.isNotEmpty(courseSearchParam.getKeyword())){ //构建关键字查询对象 MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(courseSearchParam.getKeyword(), "name", "description", "teachplan") .minimumShouldMatch("70%") .field("name", 10); boolQueryBuilder.must(multiMatchQueryBuilder);}//设置boolQueryBuilder到searchSourceBuildersearchSourceBuilder.query(boolQueryBuilder);
7.2.2按课程分类搜索
if(StringUtils.isNotEmpty(courseSearchParam.getMt())){ //根据一级分类 boolQueryBuilder.filter(QueryBuilders.termQuery("mt",courseSearchParam.getMt()));}if(StringUtils.isNotEmpty(courseSearchParam.getSt())){ //根据二级分类 boolQueryBuilder.filter(QueryBuilders.termQuery("st",courseSearchParam.getSt()));}
7.2.3按课程等级搜索
if(StringUtils.isNotEmpty(courseSearchParam.getGrade())){ //根据难度等级 boolQueryBuilder.filter(QueryBuilders.termQuery("grade",courseSearchParam.getGrade()));}
7.2.4分页查询
//设置分页参数if(page<=0){ page = 1;}if(size<=0){ size = 12;}//起始记录下标int from = (page-1)*size;searchSourceBuilder.from(from);searchSourceBuilder.size(size);
7.2.5高亮显示
//设置高亮HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.preTags(");highlightBuilder.postTags("");//设置高亮字段highlightBuilder.fields().add(new HighlightBuilder.Field("name"));searchSourceBuilder.highlighter(highlightBuilder);//取出高亮字段nameMap<String, HighlightField> highlightFields = hit.getHighlightFields();if(highlightFields!=null){ HighlightField highlightFieldName = highlightFields.get("name"); if(highlightFieldName!=null){ Text[] fragments = highlightFieldName.fragments(); StringBuffer stringBuffer = new StringBuffer(); for(Text text:fragments){ stringBuffer.append(text); } name = stringBuffer.toString(); }}course.setName(name);
7.5 访问控制层
controller.EsCourseController
package com.icoding.controller;import com.icoding.domain.Course;import com.icoding.domain.CourseSearchParam;import com.icoding.domain.QueryResponseResult;import com.icoding.service.EsCourseService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/** * @author Administrator * @version 1.0 **/@RestController@RequestMapping("/search/course")public class EsCourseController{ @Autowired EsCourseService esCourseService; @GetMapping(value="/list/{page}/{size}") public QueryResponseResult list(@PathVariable("page") int page, @PathVariable("size") int size, CourseSearchParam courseSearchParam) { return esCourseService.list(page,size,courseSearchParam); }}
访问页面:http://www.icodingedu.com/course/search
下节课预告:分享RabbitMQ实战案例分析系列课程第一节走进RabbitMQ消息队列!
记得点个在看,或者转发朋友圈哦!