SpringBoot-ES操作

ES:分布式全文搜索引擎

Elasticsearch:是一个分布式全文搜索引擎

工作流程 :

  • ES通过分词器 , 分出对应的关键字 ,
  • 用户输入对应的关键字
  • 通过关键字 , 查找对应的所有带有关键字的数据的id值 ,
  • 然后通过这些id值获取到对应的详细数据

概念 描述
索引 是sql中为了加速查询设置的主键 , 根据主键查数据
倒排索引 整个工作就是依靠倒排索引实现的 , 倒排索引是通过一个个的文档先建立倒排索引的库 , 是根据关键字查索引
创建文档
使用文档

下载安装运行ES:

  • 下载
    • https://www.elastic.co/cn/downloads/elasticsearch
    • ES的包中内置了一个jdk , 和大量的jar , ES的运行就是要依靠这些
  • 启动:
    • 在bin目录, 双击elasticsearch.bat ,启动即可 , 默认端口号是9200

ES的基本操作:

要想操作ES , 我们发送web请求即可

ES全面支持RESTful这种风格的操作

就是创建一个索引为books的 , 这个索引就相当于数据库中的库一样

索引操作 uri 请求 注意事项
创建索引 http://localhost:9200/books put请求 携带请求体 , json格式的 , 用来设置分词器 , 使用put是为了它的幂等性
查看索引 http://localhost:9200/books get请求 不能携带请求体
操作索引 http://localhost:9200/books/_doc/1 post请求 不能携带请求体 , 后边的id就是指定的文档
删除索引 http://localhost:9200/books delete请求 不能携带请求体
{
    "acknowledged": true,  //这个就是表示本次操作成功
    "shards_acknowledged": true,
    "index": "books"  //这个就是索引的名称 books , 
    //注意这个索引的名称是不允许重复的 , 
}

  • 使用ES还要下载ik分词器插件
  • 地址 : https://github.com/medcl/elasticsearch-analysis-ik/releases
  • 将下载后的插件放在ES目录下的plugins文件夹
  • ik分词器是一个插件 , 要想使用要重新启动ES

在创建索引的时候 , 在请求体中设置一组值

{
    "mappings":{
        "properties":{
            "id":{ 
                "type":"keyword" //这个值指的是ES的类型 , 设置这个属性是关键字
                //不让按照这个属性查询 : "index":"false"
            },
            "name":{
                "type":"text", //告诉ES这个字段提供的是文本信息 , 可以被分词
                "analyzer":"ik_max_word", //表示分词器 , 也就是这个字段要进行分词
                "copy_to":"all" //表示接收到name这个信息之后  , 不止在name中保存信息 , 同时将其拷贝到all这个虚拟属性中 , 
                //这么做是因为 : 如果输入一个 spring字段 , 这个字段是在name中查找还是在address中查找  , 只能在一个属性中查找  , 但是我们希望的是 , 不管是name中还是address中带有spring这个字段 , 都可以查到 , 所以 , 我们要将name和address中的信息组成一个整体 , 也就是下边的all属性字段
            },
            "address":{
                "type":"text",
                "analyzer":"ik_max_word",
                "copy_to":"all"
            },
            "description":{
                "type":"text",
                "analyzer":"ik_max_word"
            },
            //这个属性是一个虚拟的 , 可以随便起名字 , 在上边指定的 "copy_to":"all" 属性 , 主要用于查询的 , 包含了name和address的所有信息 , 在查询的时候 , 就可以同时查找name,address中带有spring的所有信息 
            "all":{   
                "type":"text",
                "analyzer":"ik_max_word"
            }
        }
    }
}

ES文档操作 :

添加文档 :

文档操作 格式 请求 注意事项
添加文档 http://localhost:9200/books/_create/2 post请求 记得指定id,不然会使用默认的id,是一个长字符串,同时记得在请求体中添加json格式的文档数据
添加文档 http://localhost:9200/books/_doc/3 post请求 同上
查看文档数据 http://localhost:9200/books/_doc/3 get请求 注意 , 这里不能使用_create , 只能使用_doc
查看所有文档数据 http://localhost:9200/books/_search get请求 这里使用的不是_doc , 而是_search
按照分词进行查询 http://localhost:9200/books/_search?q=name:思尘 get请求 这里使用的不是_doc , 而是_search
按照id删除文档 http://localhost:9200/books/_doc/3 delete请求 这里使用的也是_doc
按照id修改文档(全量修改) http://localhost:9200/books/_doc/3 put请求 这里使用的也是_doc , 要携带json类型的值 , 可以只携带一条数据 , 其他没有设置值的属性就会被抹掉 , 并且每修改一次 , 它的版本号会加一
按照id修改文档(修改单个属性,不进行覆盖) http://localhost:9200/books/_update/3 post请求 携带的数据要以"doc":{}包裹 , 就可以指定修改对应的数据 , 而不覆盖整个内容 , 版本号会加一

SpringBoot整合ES操作 :

低级别的 : low level Client

  • 导入对应坐标 :

    • <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starter-data-elasticsearchartifactId>
      dependency>
      
  • 编辑对应的配置 :

    • elasticsearch:
        rest:
          uris: http://localhost:9200
      
  • 导入对应的Template

    • @Autowired
      private ElasticsearchRestTemplate restTemplate;
      

高级别的 : high level Client

  • 导入对应的依赖 :

    • <dependency>
          <groupId>org.elasticsearch.clientgroupId>
          <artifactId>elasticsearch-rest-high-level-clientartifactId>
      dependency>
      
  • 编辑配置 :

    • //SpringBoot只提供了低版本的配置 , 高版本的没有做整合 ,所以没有配置 , 只能硬编码
      

创建对象 :

private RestHighLevelClient client;

创建一个索引:

  • void test{
        HttpHost host = HttpHost.create("http://localhost:9200"); //创建一个请求 
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder); //获取RestHighLevelClient对象
    
        //注意这里要使用这个import org.elasticsearch.client.indices.CreateIndexRequest;包不然会报错 , 显
        CreateIndexRequest request = new CreateIndexRequest("books"); //专门用来创建索引用的
        reqeust.source(json格式的数据,XcontentType.JSON) //设置请求中的参数 : 
        client.indices().create(request, RequestOptions.DEFAULT);
    
        client.close(); //需要关闭
    }
    

设置文档 :

  •     HttpHost host = HttpHost.create("http://localhost:9200"); //创建一个请求 
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder); //获取RestHighLevelClient对象
        
        IndexRequest reqeust = new IndexRequest("books").id("1");
        String json = "";
        request.source(json , XContentType.JSON);
        client.index(request,RequestOptions.DEFAULT);
        client.close(); //需要关闭
    
  • 批量设置文档 :

  • @Test
    void test(){
        HttpHost host = HttpHost.create("http://localhost:9200"); //创建一个请求 
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder); //获取RestHighLevelClient对象
        
        List<Book> bookList = bookDao.selectList(null);
        BulkRequest bule = new BulkRequest();
    for(Book book:bookList){
    IndexRequest request = new IndexRequest("books").id(book.getId().toString());
        String json = JSON.toJSONString(book);
        request.source(json,XContentType.JSON);
        bulk.add(request);
    }
        client.bulk(bulk,RequestOptions.DEFAULT);
        
        client.close(); //需要关闭
    }
    
  • 查询文档 :

    SpringBoot-ES操作_第1张图片

  • 按条件查文档:

    SpringBoot-ES操作_第2张图片

你可能感兴趣的:(SpringBoot,SpringBoot)