SpringBoot整合ElasticSearch篇章一,点赞收藏,2021爱情事业满满

2021/01/20 10:53
阅读数 13

一、SpringBoot整合ElasticSearch

在这里插入图片描述

1.SpringBoot整合ElasticSearch

ElasticSearch SpringBoot Integration

导入依赖
Maven库
先看下官网给出的参考
在这里插入图片描述


在这里插入图片描述

在这里插入图片描述
以上加上SpringBoot整合ElasticSearch需要的maven依赖,通过官方文档我们可以知道其实就是这两个jar包在起作用
在这里插入图片描述

2.链接ES的客户端

Link to ES client

如下图:
通过RestHighLevelCilent 对象,指定链接ES地址

RestHighLevelCilent  client = new RestHighLevelClient();
client.builder(new HttpHost("localhost",9200,"http"),
			new HttpHost("localhost",9201,"http")
);

在这里插入图片描述
3.编写查询表达式 Writing Query Expressions
下图这段话的意思大概是,在用RestHighLevelClient链接后,我们可以通过RequestOpetions对象来创建ElasticSearch的表达式。
在这里插入图片描述


二、如何使用Java代码操作各种复杂的ES查询

1.我们大概需要学习如下的API We Probably Need To Learn The Following APIs

在这里插入图片描述

2.Index API

Index Request基本写法

Index Request Basic Notation

字符串写法:

IndexRequest request = new IndexRequest("posts"); 
request.id("1"); 
String jsonString = "{" +
        "\"user\":\"kimchy\"," +
        "\"postDate\":\"2013-01-30\"," +
        "\"message\":\"trying out Elasticsearch\"" +
        "}";
request.source(jsonString, XContentType.JSON);

// 以上这种写法毫无疑问很麻烦,所以一般使用另一种方法代替

Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("user", "kimchy");
jsonMap.put("postDate", new Date());
jsonMap.put("message", "trying out Elasticsearch");
IndexRequest indexRequest = new IndexRequest("posts")
    .id("1").source(jsonMap); 

// 文档源作为xcontentBuilder对象提供,Elasticsearch内置帮助程序生成JSON内容

XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
   
   
    builder.field("user", "kimchy");
    builder.timeField("postDate", new Date());
    builder.field("message", "trying out Elasticsearch");
}
builder.endObject();
IndexRequest indexRequest = new IndexRequest("posts")
    .id("1").source(builder);

//文档源作为对象键对提供,它被转换为JSON格式
IndexRequest indexRequest = new IndexRequest("posts")
    .id("1")
    .source("user", "kimchy",
        "postDate", new Date(),
        "message", "trying out Elasticsearch"); 

以上两种方式,在没有工具类的情况下,第二种比较简易好用。阿里推出的JSON的工具也给我们带来了很多的简便,导入如下依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
</dependency>

在使用的时候只需要

JSON.toJSONString(对象/集合);

3.如何选择参数,参数的说明

How To Select Parameters, Parameter Description

request.routing("routing");

// 设置等待超时时间,可以有两种方式
// 1.秒值设置
request.timeout(TimeValue.timeValueSeconds(1)); 
// 2.字符串设置
request.timeout("1s"); 

4.还有很多关于参数的说明,下次我再额外的做一次说明吧。今天先说说怎么整合SpringBoot

在这里插入图片描述

三、idea实操SpringBoot集成ElasticSearch

Idea SpringBoot Integration With ElasticSearch

1、创建一个SpingBoot的项目

1、Create A SpingBoot Project

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、构建配置类,连接ES

2. Build Configuration Class And Connect ES

package com.esproject.demoapi.configES;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * author: wangjiulong
 * date: 2021-01-17
 * desc:关于elasticSearch的客户端配置
 */
@Configuration
public class ElasticSearchConfig {
   
   
    // 放到spring中待用
    @Bean
    public RestHighLevelClient getBean(){
   
   
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("127.0.0.1",9200,"http"))
        );
        return client;
    }
}

在这里插入图片描述

3.创建索引

3. Create an index

@Autowired
@Qualifier("getBean")
private RestHighLevelClient restHighLevelClient;

// 1.测试索引的创建
@Test
void testCreateIndex() throws IOException {
   
   
    // 1.创建索引
    CreateIndexRequest createIndexRequest=new CreateIndexRequest("wangjiulong_index");
    // 2.客户端执行请求
    CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
    // 3.打印索引信息
    System.out.println(createIndexResponse);
}

在这里插入图片描述
验证结果:创建之后查看下索引是否创建
在这里插入图片描述

4.测试索引是否存在

4. Test If The Index Exists

// 2.测试索引
    @Test
    void testExistIndex() throws IOException {
   
   
        GetIndexRequest getIndexRequest = new GetIndexRequest("wangjiulong_index3");
        boolean isExistIndex = restHighLevelClient.indices().exists(getIndexRequest,RequestOptions.DEFAULT);
        System.out.println(isExistIndex);
    }

在这里插入图片描述
验证结果:如果获取不存在的索引将会导致报错
在这里插入图片描述

5.删除索引

5. Remove The Index

// 3.删除索引
    @Test
    void testDeleteIndex() throws IOException{
   
   
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("wangjiulong_index");
        AcknowledgedResponse acknowledgedResponse = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
        System.out.println(acknowledgedResponse.isAcknowledged());
    }

在这里插入图片描述
验证结果:删除之后查看ES是否还能检索到该索引
在这里插入图片描述
验证结果:删除索引后再发送删除请求会导致报错
在这里插入图片描述



6.添加文档

6. Add The Document

准备一个实体类
package com.esproject.demoapi.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
   
   
    private String name;
    private int age;
}

在这里插入图片描述

// 4.添加文档
    @Test
    void testAddDocument() throws IOException {
   
   
        //1.创建对象
        User user = new User("wangjiulong",15);
        //2.创建请求
        IndexRequest indexRequest = new IndexRequest("wangjiulong_index");
        //3.规则  put/wangjiulong_index/_doc/id
        indexRequest.id("1");
        indexRequest.timeout(TimeValue.timeValueSeconds(1));//超时设置
        //4.将数据放入请求  json
        indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
        //5.客户端发送请求
        IndexResponse indexResponse = restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);
        //6.查看状态
        System.out.println(indexResponse.toString());
        System.out.println(indexResponse.status());

    }

在这里插入图片描述
验证结果:添加文档后查看是否能找到该文档
在这里插入图片描述

7.获取文档,是否存在

7. Gets The Document, Whether It Exists

//get / index/doc/1
    @Test
    void getDocument() throws IOException {
   
   
        //1.创建请求
        GetRequest getRequest = new GetRequest("wangjiulong_index","1");
        //2.可以设置不获取返回的上下文
        getRequest.fetchSourceContext(new FetchSourceContext(false));
        getRequest.storedFields("_none_");
        boolean bo = restHighLevelClient.exists(getRequest,RequestOptions.DEFAULT);
        System.out.println(bo);
    }

在这里插入图片描述

8.获取文档信息

8. Obtain Document Information

//6. 获取文档信息
    @Test
    void getDocumentInfo() throws IOException{
   
   
        GetRequest getRequest = new GetRequest("wangjiulong_index","1");
        GetResponse getResponse = restHighLevelClient.get(getRequest,RequestOptions.DEFAULT);
        System.out.println(getResponse.getSourceAsString());// 打印文档内容
        System.out.println(getResponse);// 打印对象

    }

在这里插入图片描述

9.更新文档信息

9. Update Document Information

//97.更新文档信息
    @Test
    void updateDocument() throws IOException {
   
   
        UpdateRequest updateRequest = new UpdateRequest("wangjiulong_index","1");
        updateRequest.timeout("1s");// 设置超时时间
        User user = new User("王九龙",10);
        updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
        restHighLevelClient.update(updateRequest,RequestOptions.DEFAULT);
    }

在这里插入图片描述
验证结果:查看文档信息在这里插入图片描述

10.删除文档记录

10. Delete Document Record

//8.删除文档记录
    @Test
    void deleteDocument() throws IOException {
   
   
        DeleteRequest deleteIndexRequest = new DeleteRequest("wangjiulong_index","1");
        deleteIndexRequest.timeout("1s");
        DeleteResponse deleteResponse = restHighLevelClient.delete(deleteIndexRequest,RequestOptions.DEFAULT);
        System.out.println(deleteResponse);
    }

在这里插入图片描述

11.批量的插入数据

11. Batch Inserts

//9. 批量的插入数据
    @Test
    void addDocuments() throws IOException {
   
   //批量导入
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");
        User user1 = new User("wang",21);
        User user2 = new User("jiu",21);
        User user3 = new User("long",21);
        User user4 = new User("qin",21);
        List<User> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);
        for(int i=0;i<list.size();i++){
   
   
            bulkRequest.add(
                    new IndexRequest("wangjiulong_index")
                    .id(String.valueOf(i+1))// id不设置会自动生成,这里在实际开发中记得id的唯一性,如果不唯一,将会覆盖原有的id的document的值
                    .source(JSON.toJSONString(list.get(i)),XContentType.JSON)
            );
        }
        BulkResponse bulkItemResponses = restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);
        System.out.println(bulkItemResponses.hasFailures());// 是否失败 false = 成功
    }

在这里插入图片描述

12.批量查询

12. Batch Query

 //10.批量查询
    @Test
    void searchDocuments() throws IOException {
   
   
        SearchRequest searchRequest = new SearchRequest("wangjiulong_index");
        //构建搜索条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //相当于term查询,通过QueryBuilders完成查询条件的构造
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name","qin");
        // 例如匹配所有的可以这么写 : QueryBuilders.matchAllQuery();//匹配所有
        searchSourceBuilder.query(termQueryBuilder);
        searchSourceBuilder.timeout(TimeValue.timeValueSeconds(1));// 设置超时时间 1s

        searchRequest.source(searchSourceBuilder);// 把条件丢进来
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
        System.out.println(JSON.toJSONString(searchResponse.getHits()));
        System.out.println("=-=-=-=-=-=-=-=-=-=-=-=-=-");
        for(SearchHit documentFields:searchResponse.getHits().getHits()){
   
   
            System.out.println(documentFields.getSourceAsString());
        }
    }

在这里插入图片描述

在这里插入图片描述

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部