elasticsearch学习+springboot实战教程(代码片段)

桂亭亭 桂亭亭     2023-04-06     139

关键词:

需要学习基础的可参照这两文章

Elasticsearch 学习+SpringBoot实战教程(一)

Elasticsearch 学习+SpringBoot实战教程(一)_桂亭亭的博客-CSDN博客

Elasticsearch 学习+SpringBoot实战教程(二)  

Elasticsearch 学习+SpringBoot实战教程(二)_桂亭亭的博客-CSDN博客

前言: 经过了前面2课的学习我们已经大致明白了ES怎么使用,包括原生语句,javaapi等等,现在我们要在业务中使用了,

所以我们选择spring-data作为我们的ORM框架,快速开发代码。

同时需要给规范化操作

目录

0 前辈动作

1 Springboot项目引入依赖

2 建立目录与文件

3 配置文件

 4 实体类

1 使用ElasticsearchOperations的方式

新增文档

更新文档 

删除文档

查询所有

查询指定id

分页+指定条件+高亮显示+排序+过滤结果

2 使用RestHighLevelClient的方式

精确查询

分页查询

字符匹配AND精准查询

​编辑字符匹配OR精准查询

模糊查询


0 前置动作

1 Springboot项目引入依赖

注意你的ES版本号

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.20</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.10.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.10.1</version>
        </dependency>

2 建立目录与文件

 

3 配置文件

spring:
  elasticsearch:
    uris: localhost:9200
    connection-timeout: 3000
    socket-timeout: 5000

 4 实体类

package com.example.eslearn.entity;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;

/**
 *  Document:  将这个类对象转为 es 中一条文档进行录入
 * indexName: 用来指定文档的索引名称
 * createIndex: 用来指定是否创建索引,默认为false
 */
@Document(indexName = "user", createIndex = true)
public class UserDocument implements Serializable 
    @Id // 用来将放入对象id值作为文档_id进行映射
    private String id;
    @Field(type = FieldType.Keyword)    // 字段映射类型
    private String name;
    private String sex;
    private Integer age;
    @Field(type = FieldType.Text)    // 字段映射类型

    private String city;

 

1 使用ElasticsearchOperations的方式

优点:更想我们的springdata的使用风格,简单,快捷,个人使用

新增文档

    private final ElasticsearchOperations ESO;
    // set方法注入
    @Autowired
    public CRUDService2(ElasticsearchOperations elasticsearchOperations) 
        this.ESO = elasticsearchOperations;
    
    // 新增文档
    public String save() 
        UserDocument user = new UserDocument();
        user.setName("说不定看见的");
        user.setCity("北京 上海 西安");
        user.setAge(22);
        user.setSex("男");
        UserDocument save = ESO.save(user);
        System.out.println(save);
        return JSON.toJSONString(save);
    

 使用可视化软件查询,得到下面的结果  

 

更新文档 

    // 更新文档
    public String update() 
        UserDocument user = new UserDocument();
        user.setId("W7w2HYcB32f1ZLmxRwzw");
        user.setName("说快来打见的");
        user.setCity("北京 上海 西安");
        user.setAge(21);
        user.setSex("女");
        UserDocument save = ESO.save(user);
        System.out.println(save);
        return JSON.toJSONString(save);
    

 

 

 

删除文档

    // 删除
    public String delete()
        UserDocument userDocument = new UserDocument();
        userDocument.setId("8966e506-1763-4d4b-bf1c-4f5d9bd9b052");
        return ESO.delete(userDocument);
    

 

查询所有

    // 查询所有
    public String findAll()
        //查询所有
        SearchHits<UserDocument> search = ESO.search(Query.findAll(), UserDocument.class);
        for (SearchHit<UserDocument> uc : search) 
            System.out.println(uc.getContent());
        
        return JSON.toJSONString(search);
    

 

查询指定id

    // 根据id查询文档
    public String getById()
        UserDocument userDocument = ESO.get("W7w2HYcB32f1ZLmxRwzw", UserDocument.class);
        return JSON.toJSONString(userDocument);
    

分页+指定条件+高亮显示+排序+过滤结果

服务层

 //大杂烩,一次学会
    public String findSource()
        //查询条件构建
        MatchQueryBuilder mp=new MatchQueryBuilder("name","妲己");

        //排序构建
        FieldSortBuilder f = new FieldSortBuilder("age");
        //分页构建
        Pageable page= PageRequest.of(0,5);
        // 高亮构建
        HighlightBuilder highlightBuilder = new HighlightBuilder()
                .preTags("<span style='color:yellow'>")
                .postTags("</span>")
                .field("name");
        //结果过滤构建,相当于返回那些字段
        FetchSourceFilter filter = new FetchSourceFilter(new String[]"name", "city", null);
        //查询语句构建
        NativeSearchQueryBuilder  query = new NativeSearchQueryBuilder()
                .withQuery(mp)
                .withSorts(f)
                .withPageable(page)
                .withHighlightBuilder(highlightBuilder)
                .withSourceFilter(filter);
        //执行查询
        SearchHits<UserDocument> search = ESO.search(query.build(), UserDocument.class);
        return JSON.toJSONString(search);
    

控制器

    @GetMapping("/findSource")
    private String findSource()
        return sv.findSource();
    

 

 

 

2 使用RestHighLevelClient的方式

优点:安全,企业级常用

精确查询

对应的原生查询语句

注意这里的term就是精准查询到 关键字

GET user/_search

  "query": 
    "term": 
      "city": "上海"
    
    
  

服务层 

    // 文档搜索
    public String searchDocument(String indexName,String city)
        //2 构建搜索请求
        SearchRequest searchRequest = new SearchRequest().indices(indexName);
        //3 构建搜索内容
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("city", city);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(termQueryBuilder);
        //4 填充搜索内容
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = null;
        try 
            //5 执行搜索操作
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
         catch (IOException e) 
            throw new RuntimeException(e);
        
        //6 返回值
        return JSON.toJSONString(searchResponse.getHits().getHits());
    

控制器


    @GetMapping("/searchUserByCity")
    public String searchUserByCity() throws IOException 
        return service.searchDocument("user","上海");
    

访问链接localhost:8080/searchUserByCity

分页查询

GET user/_search

  "query": 
    "term": 
      "city": "上海"
    
    
  ,
  "from":0,
  "size":5

服务层

  // 文档搜索--分页查询
    public String searchDocument2(String indexName,String city)
        //2 构建搜索请求
        SearchRequest searchRequest = new SearchRequest().indices(indexName);
        //3 构建搜索内容
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //拿到前5条数据
        searchSourceBuilder
                .query(QueryBuilders.termQuery("city", city))
                .from(0)
                .size(5);

        //4 填充搜索内容
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = null;
        try 
            //5 执行搜索操作
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
         catch (IOException e) 
            throw new RuntimeException(e);
        
        //6 返回值
        return JSON.toJSONString(searchResponse.getHits().getHits());
    

控制层 

    @GetMapping("/searchUserByCity2")
    public String searchUserByCity2() throws IOException 
        return service.searchDocument2("user","上海");
    

访问localhost:8080/searchUserByCity2

字符匹配AND精准查询

term 与matchphrase的比较 term用于精确查找有点像 mysql里面的"=" match是先将查询关键字分词然后再进行查找。term一般用在keywokrd类型的字段上进行精确查找。

注意这里的bool,表示使用布尔查询,其中的must是相当于SQL语句中的and的意思。

所以就是查找name中包含“妲己”并且年龄为22岁的信息,请注意不能写成"妲",因为我们在新建文档的时候是这样新建的“妲己”,那么我们如果匹配“妲”就会匹配不到,加入这样写就可以匹配到了“妲 己”,请注意空格,这是分词的依据之一

ES查询语句。

GET user/_search

  "query": 
    "bool":
      "must": [
        
          "match_phrase": 
            "name": "妲己"
          
        ,
         
          "term": 
            "age": "32"
          
        
      ]
    
    
  ,
  "from":0,
  "size":10

服务层

// 文档分词搜索+精确查询
    public String searchDocument3(String indexName,String name,Integer age)
        //2 构建搜索请求
        SearchRequest searchRequest = new SearchRequest().indices(indexName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //3 构建复杂的查询语句
        BoolQueryBuilder bq=QueryBuilders
                .boolQuery()
                //分词匹配
                .must(QueryBuilders.matchPhraseQuery("name",name))
                //精确匹配
                .must(QueryBuilders.matchQuery("age",age));
        //4 填充搜索语句
        searchSourceBuilder
                .query(bq)
                .from(0)
                .size(5);

        //4 填充搜索内容
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = null;
        try 
            //5 执行搜索操作
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
         catch (IOException e) 
            throw new RuntimeException(e);
        
        //6 返回值
        return JSON.toJSONString(searchResponse.getHits());
    

控制层

    @GetMapping("/searchUser3")
    public String searchUser3() throws IOException 
        return service.searchDocument3("user","妲己",32);
    

字符匹配OR精准查询

 原始查询语句

GET user/_search

  "query": 
    "bool":
      "should": [
        
          "match_phrase": 
            "name": "妲己"
          
        ,
         
          "term": 
            "age": "32"
          
        
      ]
    
    
  ,
  "from":0,
  "size":10

服务层

    // 文档分词搜索OR精确查询
    public String searchDocument4(String indexName,String name,Integer age)
        //2 构建搜索请求
        SearchRequest searchRequest = new SearchRequest().indices(indexName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //3 构建复杂的查询语句
        BoolQueryBuilder bq=QueryBuilders
                .boolQuery()
                //分词匹配
                .should(QueryBuilders.matchPhraseQuery("name",name))
                //精确匹配
                .should(QueryBuilders.matchQuery("age",age));
        //4 填充搜索语句
        searchSourceBuilder
                .query(bq)
                .from(0)
                .size(5);

        //4 填充搜索内容
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = null;
        try 
            //5 执行搜索操作
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
         catch (IOException e) 
            throw new RuntimeException(e);
        
        //6 返回值
        return JSON.toJSONString(searchResponse.getHits());
    

控制层 

    @GetMapping("/searchUser4")
    public String searchUser4() throws IOException 
        return service.searchDocument4("user","妲己",22);
    

 结果

模糊查询

原始语句

GET user/_search

  "query": 
    "wildcard": 
      "city": 
        "value": "上*"
      
    
  
    // 文档模糊查询
    public String searchDocument5(String indexName,String city)
        //2 构建搜索请求
        SearchRequest searchRequest = new SearchRequest().indices(indexName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //3 构建模糊查询的语句
        WildcardQueryBuilder bq=QueryBuilders
                .wildcardQuery("city",city);
        //4 填充搜索语句
        searchSourceBuilder
                .query(bq);

        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = null;
        try 
            //5 执行搜索操作
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
         catch (IOException e) 
            throw new RuntimeException(e);
        
        //6 返回值
        return JSON.toJSONString(searchResponse.getHits());
    
    @GetMapping("/searchUser5")
    public String searchUser5() throws IOException 
        return service.searchDocument5("user","上*");
    

结果 

elasticsearch学习+springboot实战教程(代码片段)

需要学习基础的可参照这两文章Elasticsearch学习+SpringBoot实战教程(一)Elasticsearch学习+SpringBoot实战教程(一)_桂亭亭的博客-CSDN博客Elasticsearch学习+SpringBoot实战教程(二)  Elasticsearch学习+Sprin... 查看详情

elasticsearch搜学习笔记

Elasticsearch学习笔记B站【尚硅谷】ElasticSearch入门到精通2021最新教程学习文档下载链接常用APIforpostman 查看详情

elasticsearch学习笔记

在学习elasticsearch之前,我们先要弄清楚几个问题,就是what,why和how1.what-------elasticsearch是什么 官方概念:elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsear... 查看详情

elasticsearch学习springboot整合elasticsearch的原生方式

前面我们已经介绍了springboot整合Elasticsearch的jpa方式,这种方式虽然简便,但是依旧无法解决我们较为复杂的业务,所以原生的实现方式学习能够解决这些问题,而原生的学习方式也是Elasticsearch聚合操作的一个基础。一、修改spr... 查看详情

elasticsearch入门+基础概念学习

原文地址:https://www.cnblogs.com/shoufeng/p/9887327.html目录1Elasticsearch概述1.1Elasticsearch是什么1.2Elasticsearch的优点1.3Elasticsearch的相关产品1.4Elasticsearch的使用场景2Elasticsearch的功能概述2.1分布式的搜索引擎和数据分析引擎2.2全文检索结构... 查看详情

elasticsearch学习笔记一

一.Elasticsearch简介    Elasticsearch是基于ApacheLucene的开源的搜索引擎。支持时间检索和全文检索。二.安装下载来自http://www.elasticsearch.org/download/的ElasticSearch。        w 查看详情

elasticsearch学习记录

参考资料:ElasticSearch大数据分布式弹性搜索引擎使用ELK日志分析平台搭建全过程ELK日志监控平台环境搭建及使用说明  查看详情

elasticsearch学习

前言:ES学习可参考《Elasticsearch:权威指南》,这个在线电子书内容介绍的很是详细官网 https://www.elastic.co/中文社区 http://elasticsearch.cn/ 目录安装安装插件配置CURL命令JAVAAPI其他  安装首先我们需要去官网下载安... 查看详情

elasticsearch学习笔记elasticsearch及elasticsearchhead安装配置(代码片段)

一、安装与配置1、到官网下载Elasticsearch,https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.3.zip2、解压成三分份3、下载Elasticsearch的管理工具 https://codeload.github.com/mobz/elasticsearch-head/zip/mast 查看详情

elasticsearch入门学习:使用javaapi学习es

一、Maven依赖<!--刚开始少这个包创建索引失败ValidationFailed:1:typeismissing;官方文档并没有给这个提示--><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId>< 查看详情

(转)elasticsearch学习

(二期)21、全文搜索引擎Elasticsearch【课程21】elasticsearch.xmind82.1KB【课程21】lucene.xmind0.8MB【课程21】基本用法....api.xmind83.2KB【课程21预习】全...arch.xmind0.4MB Lucene为了更深入地理解ElasticSearch的工作原理,特别是索引和查询这... 查看详情

elasticsearch-尚硅谷(9.面试题)学习笔记

...:(8.优化)学习笔记文章目录1为什么要使用Elasticsearch?2Elasticsearch的master选举流程?3Elasticsearch集群脑裂问题?4Elasticsearch索引文档的流程?5Elasticsearch更新和删除文档的流程?6Elasticsearch搜索的流 查看详情

elasticsearch学习笔记-03探索集群

...据官方文档的翻译,能力有限、水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸。原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_exploring_your_cluster.htmlRESTAPI现在咱们已经成功让Elasticsearch的节... 查看详情

elasticsearch学习

Elasticsearch研究有一段时间了,现特将Elasticsearch相关核心知识、原理从初学者认知、学习的角度,从以下9个方面进行详细梳理。欢迎讨论……0.带着问题上路——ES是如何产生的?(1)思考:大规模数据如何检索?如:当系统数... 查看详情

elasticsearch学习2--elasticsearch数据类型简介

1.Elasticsearch是 面向文档型数据库,这意味着它存储的是整个对象或者 文档,它不但会存储它们,还会为他们建立索引,这样你就可以搜索他们了。你可以在Elasticsearch中索引、搜索、排序和过滤这些文档。不需要成行成... 查看详情

elasticsearch学习笔记-02安装

...据官方文档的翻译,能力有限、水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸。原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.htmlElasticsearch要求Java最低版本为8.截止本文撰写的时... 查看详情

elasticsearch学习笔记elasticsearch分布式机制

一、Elasticsearch对复杂分布式机制透明的隐藏特性    1、分片机制:            (1)index包含多个shard,每个shard都是一个最小工作单元,承载部分数据,lucene实例,完整的... 查看详情

[elasticsearch]螺丝刀学习笔记之——elasticsearch(7.0up学习概览)(代码片段)

...呢?这不,压箱底的两篇学习笔记其中之一——ElasticSearch学习概览,就此JI出~~,祝自己和各位猿族兄嘚们节日快乐,同时欢迎各位猿友们一起交流指正~~🐵😘什么是ES?ES是一种开源、RESTful& 查看详情