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

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

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

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

目录

    • 一、Elasticsearch简介
    • 二、下载与安装
      • 1、Elasticsearch官网下载地址
      • 2、下载成功
      • 3、双击elasticsearch.bat启动
      • 4、启动成功
    • 三、数据格式
    • 四、索引
      • 1、创建索引
      • 2、查询索引
      • 3、删除索引
    • 五、文档
      • 1、创建文档
      • 2、查询文档
    • 六、复杂查询
      • 1、指定条件查询
      • 2、多条件查询
      • 3、部分词汇匹配查询
      • 4、聚合查询
    • 七、代码实例
      • 1、引入pom
      • 2、添加索引
      • 3、运行出错
      • 4、查询索引
      • 5、插入文档
      • 6、批量插入文档
      • 7、根据条件查询文档中全部数据
      • 8、按条件查询
      • 9、分页查询
      • 10、按年龄排序
      • 11、按条件查询
      • 12、组合条件查询
      • 13、模糊查询
      • 14、聚合查询

一、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
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第1张图片

2、下载成功

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第2张图片

3、双击elasticsearch.bat启动

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第3张图片

4、启动成功

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第4张图片

三、数据格式

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将Elasticsearch里存储文档数据和关系型数据库Mysql存储数据的概念进行一个类比:
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第5张图片
ES里的Index可以看做一个库,而Types相当于表,Documents则相当于表的行。

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

四、索引

1、创建索引

在postman中,向ES服务器发送PUT请求:127.0.0.1:9200/work
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第6张图片
由于PUT请求具有幂等性,每次PUT请求创建的结果都是一样的,再次请求时,由于ES中已经存在名为work的索引了,所以会创建失败。
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第7张图片
POST是不具有幂等性的,所以POST请求后,结果可能不一样,所以添加索引的时候是不允许使用POST请求的。
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第8张图片

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

2、查询索引

(1)通过GET请求可以获取单一索引
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第9张图片
(2)获取全部索引信息

127.0.0.1:9200/_cat/indicesv
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第10张图片

3、删除索引

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第11张图片

五、文档

1、创建文档

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

由于文档生成时会自动创建一个唯一性标识,因为POST不是幂等性的,PUT是幂等性的,所以这里只能用POST。
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第12张图片
可以指定id
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第13张图片

2、查询文档

(1)根据id查询

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第14张图片
(2)查询所有文档

127.0.0.1:9200/work/_search
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第15张图片
3、更改文档内容
(1)修改文档id=1001的内容,恭喜哪吒大佬被评选为“2021博客之星TOP10”,锣鼓喧天,鞭炮旗鼓。
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第16张图片
(2)局部更新

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第17张图片
(3)局部更新成功,恭喜哪吒成功晋升TOP5。

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第18张图片

六、复杂查询

1、指定条件查询

(1)查询name为哪吒的索引(通过请求路径:127.0.0.1:9200/work/_searchq=name:哪吒)
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第19张图片
注意:满篇全是截图也不好看,以下就不截图了,望谅解。

(2)请求体查询

get请求:127.0.0.1:9200/work/_search

请求体:

{
   "query":{
       "match":{
          "name":"哪吒"
       }
   } 
}

(3)分页查询

get请求:127.0.0.1:9200/work/_search

请求体:

{
   "query":{
       "match_all":{
          
       }
   } ,
   "from":0,
   "size":2
}

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

{
   "query":{
       "match_all":{
         
       }
   } ,
   "from":0,
   "size":2,
   "_source":["title"],
   "sort":{
       "_id":"desc"
   }
}

2、多条件查询

must表示and匹配

{
   "query":{
       "bool":{
         "must":[
             {
                 "match":{
                     "name":"哪吒"
                 }
             },{
                 "match":{
                     "title":"博客专家"
                 }
             }
         ]
       }
   } 
}

should表示or匹配

{
   "query":{
       "bool":{
         "should":[
             {
                 "match":{
                     "name":"哪吒"
                 }
             },{
                 "match":{
                     "name":"CSDN"
                 }
             }
         ]
       }
   } 
}

范围匹配:工资大于10000

{
   "query":{
       "bool":{
         "should":[
             {
                 "match":{
                     "name":"哪吒"
                 }
             },{
                 "match":{
                     "name":"CSDN"
                 }
             }
         ],
         "filter":{
             "range":{
                 "money":10000
             }
         }
       }
   } 
}

3、部分词汇匹配查询

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

{
   "query":{
       "match":{
         "name":"哪"
       }
    }
}

完全匹配

{
   "query":{
       "match_phrase":{
         "name":"哪"
       }
    }
}

高亮显示

{
   "query":{
       "match":{
         "name":"哪"
       }
    },
    "highlight":{
        "fields":{
            "name":{}
        }
    }
}

4、聚合查询

(1)分组查询

{
   "aggs":{
       "money_group":{
         "terms":{
             "field":"money"
         }
       }
    },
    "size":0
}

(2)平均值查询

{
   "aggs":{
       "money_avg":{
         "avg":{
             "field":"money"
         }
       }
    },
    "size":0
}

七、代码实例

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
            
        
    
 

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();
    }
}

3、运行出错

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第20张图片
解决方法:

将pom中


    org.elasticsearch.client
    elasticsearch-rest-high-level-client
    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

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();
    }
}

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();
    }
}

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第21张图片

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();
}

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();
}

控制台输出
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第22张图片

8、按条件查询

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

9、分页查询

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

10、按年龄排序

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

控制台输出
springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第23张图片

11、按条件查询

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第24张图片

12、组合条件查询

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第25张图片

13、模糊查询

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

14、聚合查询

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第26张图片

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

springboot整合全文搜索引擎Elasticsearch Spring Boot 28_第27张图片

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

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

你可能感兴趣的:(面试,学习路线,阿里巴巴,android,前端,后端)