• springboot整合全文搜索引擎Elasticsearch Spring Boot 28


    ?? 作者简介:CSDN2021博客之星亚军??、新星计划导师、博客专家??

    ?? 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

    ?? 关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步

    目录

    一、Elasticsearch简介

    Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为Elastic Stack的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。

    The Elastic Stack包括Elasticsearch、Kibana、Beats和Logstash,也称为ELK Stack。

    能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化

    Elasticsearch简称ES,ES是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

    PB是数据存储容量的单位,它等于2的50次方个字节,或者在数值上大约等于1000TB。

    二、下载与安装

    1、Elasticsearch官网下载地址

    https://www.elastic.co/cn/downloads/elasticsearch
    在这里插入图片描述

    2、下载成功

    在这里插入图片描述

    3、双击elasticsearch.bat启动

    在这里插入图片描述

    4、启动成功

    在这里插入图片描述

    三、数据格式

    Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将Elasticsearch里存储文档数据和关系型数据库Mysql存储数据的概念进行一个类比:
    在这里插入图片描述
    ES里的Index可以看做一个库,而Types相当于表,Documents则相当于表的行。

    Elasticsearch7.X中,Type的概念已经被删除了。

    四、索引

    1、创建索引

    在postman中,向ES服务器发送PUT请求:127.0.0.1:9200/work
    在这里插入图片描述
    由于PUT请求具有幂等性,每次PUT请求创建的结果都是一样的,再次请求时,由于ES中已经存在名为work的索引了,所以会创建失败。
    在这里插入图片描述
    POST是不具有幂等性的,所以POST请求后,结果可能不一样,所以添加索引的时候是不允许使用POST请求的。
    在这里插入图片描述

    什么是幂等性?
    在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

    2、查询索引

    (1)通过GET请求可以获取单一索引
    在这里插入图片描述
    (2)获取全部索引信息

    127.0.0.1:9200/_cat/indicesv
    在这里插入图片描述

    3、删除索引

    在这里插入图片描述

    五、文档

    1、创建文档

    ES中的文档相当于MySQL中的表数据,数据格式为JSON格式。

    由于文档生成时会自动创建一个唯一性标识,因为POST不是幂等性的,PUT是幂等性的,所以这里只能用POST。
    在这里插入图片描述
    可以指定id
    在这里插入图片描述

    2、查询文档

    (1)根据id查询

    在这里插入图片描述
    (2)查询所有文档

    127.0.0.1:9200/work/_search
    在这里插入图片描述
    3、更改文档内容
    (1)修改文档id=1001的内容,恭喜哪吒大佬被评选为“2021博客之星TOP10”,锣鼓喧天,鞭炮旗鼓。
    在这里插入图片描述
    (2)局部更新

    在这里插入图片描述
    (3)局部更新成功,恭喜哪吒成功晋升TOP5。

    在这里插入图片描述

    六、复杂查询

    1、指定条件查询

    (1)查询name为哪吒的索引(通过请求路径:127.0.0.1:9200/work/_searchq=name:哪吒)
    在这里插入图片描述
    注意:满篇全是截图也不好看,以下就不截图了,望谅解。

    (2)请求体查询

    get请求:127.0.0.1:9200/work/_search

    请求体:

    {
       "query":{
           "match":{
              "name":"哪吒"
           }
       } 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (3)分页查询

    get请求:127.0.0.1:9200/work/_search

    请求体:

    {
       "query":{
           "match_all":{
              
           }
       } ,
       "from":0,
       "size":2
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (4)只获取指定字段 and 根据id排序

    {
       "query":{
           "match_all":{
             
           }
       } ,
       "from":0,
       "size":2,
       "_source":["title"],
       "sort":{
           "_id":"desc"
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2、多条件查询

    must表示and匹配

    {
       "query":{
           "bool":{
             "must":[
                 {
                     "match":{
                         "name":"哪吒"
                     }
                 },{
                     "match":{
                         "title":"博客专家"
                     }
                 }
             ]
           }
       } 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    should表示or匹配

    {
       "query":{
           "bool":{
             "should":[
                 {
                     "match":{
                         "name":"哪吒"
                     }
                 },{
                     "match":{
                         "name":"CSDN"
                     }
                 }
             ]
           }
       } 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    范围匹配:工资大于10000

    {
       "query":{
           "bool":{
             "should":[
                 {
                     "match":{
                         "name":"哪吒"
                     }
                 },{
                     "match":{
                         "name":"CSDN"
                     }
                 }
             ],
             "filter":{
                 "range":{
                     "money":10000
                 }
             }
           }
       } 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    3、部分词汇匹配查询

    将每一个值拆解,组成倒排索引,方便进行全文检索。

    {
       "query":{
           "match":{
             "name":"哪"
           }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    完全匹配

    {
       "query":{
           "match_phrase":{
             "name":"哪"
           }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    高亮显示

    {
       "query":{
           "match":{
             "name":"哪"
           }
        },
        "highlight":{
            "fields":{
                "name":{}
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4、聚合查询

    (1)分组查询

    {
       "aggs":{
           "money_group":{
             "terms":{
                 "field":"money"
             }
           }
        },
        "size":0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (2)平均值查询

    {
       "aggs":{
           "money_avg":{
             "avg":{
                 "field":"money"
             }
           }
        },
        "size":0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    七、代码实例

    1、引入pom

    
    
        4.0.0
        
            org.springframework.boot
            spring-boot-starter-parent
            2.2.1.RELEASE
             
        
        com.guor
        es
        0.0.1-SNAPSHOT
        es
        Demo project for Spring Boot
        
            1.8
        
        
            
                org.springframework.boot
                spring-boot-starter
            
     
            
                org.springframework.boot
                spring-boot-starter-test
                test
            
     
            
                org.elasticsearch
                elasticsearch
                7.8.0
            
            
            
                org.elasticsearch.client
                elasticsearch-rest-high-level-client
                7.8.0
                
                    
                        org.elasticsearch.client
                        elasticsearch-rest-client
                    
                
            
            
                org.elasticsearch.client
                elasticsearch-rest-client
                7.8.0
            
            
            
                org.apache.logging.log4j
                log4j-api
                2.8.2
            
            
                org.apache.logging.log4j
                log4j-core
                2.8.2
            
            
                com.fasterxml.jackson.core
                jackson-databind
                2.9.9
            
            
                org.projectlombok
                lombok
                true
            
            
            
                junit
                junit
                4.12
            
        
     
        
            
                
                    org.springframework.boot
                    spring-boot-maven-plugin
                
            
        
     
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91

    2、添加索引

    package com.guor.es.test;
     
    import org.apache.http.HttpHost;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.client.indices.CreateIndexRequest;
    import org.elasticsearch.client.indices.CreateIndexResponse;
     
    public class ESTest {
        public static void main(String[] args) throws Exception{
            //创建es客户端
            RestHighLevelClient esClient = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost",9200,"http"))
            );
     
            //创建索引
            CreateIndexRequest request = new CreateIndexRequest("student");
     
            CreateIndexResponse createIndexResponse = esClient.indices().create(request, RequestOptions.DEFAULT);
     
            boolean acknowledged = createIndexResponse.isAcknowledged();
            System.out.println("创建索引:"+acknowledged);
            // 关闭es客户端
            esClient.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    3、运行出错

    在这里插入图片描述
    解决方法:

    将pom中

    
        org.elasticsearch.client
        elasticsearch-rest-high-level-client
        7.8.0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    替换为:

    
        org.elasticsearch.client
        elasticsearch-rest-high-level-client
        7.8.0
        
            
                org.elasticsearch.client
                elasticsearch-rest-client
            
        
    
    
        org.elasticsearch.client
        elasticsearch-rest-client
        7.8.0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4、查询索引

    package com.guor.es.test;
     
    import org.apache.http.HttpHost;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.client.indices.CreateIndexRequest;
    import org.elasticsearch.client.indices.CreateIndexResponse;
    import org.elasticsearch.client.indices.GetIndexRequest;
    import org.elasticsearch.client.indices.GetIndexResponse;
     
    public class ESTest {
        public static void main(String[] args) throws Exception{
            //创建es客户端
            RestHighLevelClient esClient = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost",9200,"http"))
            );
     
            //创建索引
            GetIndexRequest request = new GetIndexRequest("student");
     
            GetIndexResponse getIndexResponse = esClient.indices().get(request, RequestOptions.DEFAULT);
     
            //响应状态
            System.out.println(getIndexResponse.getAliases());
            System.out.println(getIndexResponse.getMappings());
            System.out.println(getIndexResponse.getSettings());
            // 关闭es客户端
            esClient.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    5、插入文档

    package com.guor.es.test;
     
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.apache.http.HttpHost;
    import org.elasticsearch.action.index.IndexRequest;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.client.indices.GetIndexRequest;
    import org.elasticsearch.client.indices.GetIndexResponse;
    import org.elasticsearch.common.xcontent.XContentType;
     
    public class ESTestDoc {
        public static void main(String[] args) throws Exception{
            addDoc();
        }
     
     
        private static void addDoc() throws Exception{
            //创建es客户端
            RestHighLevelClient esClient = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost",9200,"http"))
            );
     
            IndexRequest request = new IndexRequest();
            request.index("work").id("1001");
     
            Work work = new Work();
            work.setName("哪吒");
            work.setAge(28);
            work.setSex(0);
     
            ObjectMapper mapper = new ObjectMapper();
            String workJson = mapper.writeValueAsString(work);
            IndexRequest response = request.source(workJson, XContentType.JSON);
            System.out.println(response.getShouldStoreResult());
            esClient.index(request, RequestOptions.DEFAULT);
     
            // 关闭es客户端
            esClient.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    在这里插入图片描述

    6、批量插入文档

    private static void addBatchDoc() throws Exception{
        //创建es客户端
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost",9200,"http"))
        );
     
        BulkRequest request = new BulkRequest();
        request.add(new IndexRequest().index("work").id("1001").source(XContentType.JSON, "name", "csdn哪吒"));
        request.add(new IndexRequest().index("work").id("1002").source(XContentType.JSON, "name", "csdn哪吒1"));
        request.add(new IndexRequest().index("work").id("1003").source(XContentType.JSON, "name", "csdn哪吒2"));
        BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(response.getTook());
        System.out.println(response.getItems());
        // 关闭es客户端
        esClient.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    7、根据条件查询文档中全部数据

    /**
     * 查询索引中全部数据
     */
    private static void getDoc() throws Exception{
        //创建es客户端
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost",9200,"http"))
        );
     
        //查询索引中全部数据
        SearchRequest request = new SearchRequest();
        request.indices("work");
     
        //构造查询条件,匹配所有
        SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        request.source(query);
     
        //查询文档
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        //查询的结果
        SearchHits hits = response.getHits();
        //查询条数
        System.out.println(hits.getTotalHits());
        //查询时间
        System.out.println(response.getTook());
        //查询的具体数据
        for (SearchHit hit : hits){
            System.out.println(hit.getSourceAsString());
        }
        // 关闭es客户端
        esClient.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    控制台输出
    在这里插入图片描述

    8、按条件查询

    SearchSourceBuilder query = new SearchSourceBuilder().
    query(QueryBuilders.termQuery("name","csdn哪吒"));
    
    • 1
    • 2

    9、分页查询

    //构造查询条件,分页查询
    SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
    //起始页
    builder.from(0);
    //每页数据量
    builder.size(2);
    request.source(builder);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    10、按年龄排序

    //按照年龄排序
    SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
    builder.sort("age", SortOrder.DESC);
    request.source(builder);
    
    • 1
    • 2
    • 3
    • 4

    控制台输出
    在这里插入图片描述

    11、按条件查询

    在这里插入图片描述

    12、组合条件查询

    在这里插入图片描述

    13、模糊查询

    //差一个字符也能匹配
    SearchSourceBuilder builder = new SearchSourceBuilder();
    FuzzyQueryBuilder fuzziness = QueryBuilders.
    fuzzyQuery("name", "哪吒").fuzziness(Fuzziness.ONE);
     
    builder.query(fuzziness);
    request.source(builder);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    14、聚合查询

    在这里插入图片描述

    上一篇:Spring Boot整合流控组件Sentinel | Spring Boot 27
    下一篇:SpringBoot学习路线总结,跟着路线走,不迷路(附思维导图)

    在这里插入图片描述

    关注公众号,备注1024,获取Java学习路线思维导图、加入万粉计划交流群

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    OA办公系统在企业中的主要作用
    通义灵码,阿里巴巴的编程辅助工具
    JavaScript正则表达式:正则表达式中的特殊字符
    Mac 常用软件汇总
    教育直播APP开发
    Git分布式版本控制工具
    RK3576:革新智能设备体验的高性能AI芯片
    要学很多数学吗 - 给要入行机器学习的朋友们的建议
    国家网络安全周 | 金融日,一起 get金融行业数据安全
    基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术
  • 原文地址:https://blog.csdn.net/m0_67403013/article/details/126115071