android应用开发实战_Elasticsearch企业应用实战开发艾编程官网课程搜索项目

“咱们老百姓,今天真高兴儿”,今天为大家分享Elasticsearch的企业应用实战课程啦,经过前三节课的ES安装、中文分词器安装、Kibana安装以及常见命令的了解之后,我们就开始用前面所学的东西开始实战了,你说开心不开心呢!

cf94d2cd5ac70a75bb4cefc38b02c96c.png

大家好,我是小艾同学(一位可甜、可萌、可温柔、可暴力的程序员鼓励师83389a8db5e7df123346e3152b8eacbb.png)接下来我们正式课程开始了,在开始之前呢,我先带着大家看看艾编程官网的搜索页面吧!

62f1b143305e136d35a7cb7dfc80d2e3.png

温馨提示:以上显示的域名是展示域名,非访问域名,艾编程官网地址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消息队列!

640ae493291dc2a6df2f81c7a86c168f.png

记得点个在看,或者转发朋友圈哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值