ElasticSearch02——RestClient操作索引库和文档

RestClient是es官方提供的一套用于通过代码操作es的api,es官方提供了不同语言的客户端,这些客户端本质上就是组装的DSL语句,通过http请求发送给es

使用es需要引入对应的依赖,注意依赖版本要和es版本一致


            org.elasticsearch.client
            elasticsearch-rest-high-level-client
            7.12.1
        

注意依赖版本如果和springboot不一致,需要在properties添加es的版本来覆盖springboot默认的版本,如图ElasticSearch02——RestClient操作索引库和文档_第1张图片

 创建一个测试类,先初始化RestHighLevelClient,连接到es,代码如下

import java.io.IOException;

public class HotelIndexTest {

    //声明对象,并做对象初始化连接到es,提高代码复用性
    private RestHighLevelClient client;
    @BeforeEach
    void set(){
        this.client=new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.65.129:9200/")//es地址
        ));
    }

    @AfterEach
    void terDown() throws IOException {
        this.client.close();}


}

然后打印一下对象创建的对象,如果有值就证明初始化成功了

@Test
    void test1(){
        System.out.println(client);
    }

索引库的基本操作

成功后创建一个新的索引库,这里的DSL语句需要我们手动编写或者自己引入,我先新建一个类,写好DSL语句,这里简单在Dev Tools写一个,然后复制到代码里去,如下

public class HotelConstants {

public static final String MAPPIN_TEMPLATE2 ="{\n" +
            "  \"mappings\": {\n" +
            "    \"properties\": {\n" +
            "      \"name\":{\n" +
            "        \"type\":\"text\"\n" +
            "      },\n" +
            "      \"score\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "      \"location\":{\n" +
            "        \"type\": \"geo_point\"\n" +
            "      }\n" +
            "    }\n" +
            "  }\n" +
            "}\n";
    }
}

然后写新增索引库的方法,并将刚才的DSL语句引入到下面代码中,如下

 @Test   //创建索引库
    void testCreateIndex() throws IOException {
        //1、创建request对象,指定索引库名字
        CreateIndexRequest request = new CreateIndexRequest("student");
        //2、请求参数,MAPPING_TEMPLATE是静态常量字符串,内容是创建索引库的DSL语句
        request.source(MAPPIN_TEMPLATE2, XContentType.JSON);
        //3、发送请求
        client.indices().create(request, RequestOptions.DEFAULT);

    }

点击运行,然后去Dev Tools通过GET /student 查看是否创建成功ElasticSearch02——RestClient操作索引库和文档_第2张图片

 判断索引库是否存在,根据不同的业务需求创建不同的对象,判断是否存在的前提是要先去检索索引库,所以用的是查询的对象

@Test  //判断索引是否存在
    void testExistsHotelIndex() throws IOException {
        //查看索引库
        GetIndexRequest getIndexRequest = new GetIndexRequest("student");
        //判断索引库是否存在
        boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);

              System.out.println(exists ? "索引库存在":"索引库不存在" );//打印true或者false判断索引库是否存在

    }

删除索引库,直接创建删除对象

@Test  //删除索引库
    void testDeleteHotelIndex() throws IOException {
        //创建删除对象
        DeleteIndexRequest request = new DeleteIndexRequest("student");
        //删除请求
        client.indices().delete(request,RequestOptions.DEFAULT);
    }

然后可以通过判断索引库是否存在方法再去看一下索引库是否还在,也可以通过GET /student查看是否存在ElasticSearch02——RestClient操作索引库和文档_第3张图片

文档的基本操作

新增文档:通常情况新增的数据都是从数据库导入的,所以需要先连接数据库并查到数据,并且根据数据库的字段创建对应的索引库,然后才是导入数据,先创建pojo对象,这里取名Hotel,

@Data
@TableName("tb_hotel")
public class Hotel {
    @TableId(type = IdType.INPUT)
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String longitude; //经度
    private String latitude; //纬度
    private String pic;
}

这里注意,这个数据库表有一个地理位置,用经纬度表示,是两个字段,而在es中经纬度是将这两个字段拼接起来的一个字段,格式不同所以要做转换,所以要再写一个pojo对象这里叫做HotelDoc

@Data
@NoArgsConstructor
public class HotelDoc {
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String location;
    private String pic;

    public HotelDoc(Hotel hotel) {
        this.id = hotel.getId();
        this.name = hotel.getName();
        this.address = hotel.getAddress();
        this.price = hotel.getPrice();
        this.score = hotel.getScore();
        this.brand = hotel.getBrand();
        this.city = hotel.getCity();
        this.starName = hotel.getStarName();
        this.business = hotel.getBusiness();
        this.location = hotel.getLatitude() + ", " + hotel.getLongitude();//这里将数据库的两个字段拼为一个
        this.pic = hotel.getPic();
    }
}

这里应该还要写一些数据库的查询方法,然后把查到的数据才能传到es,查询方法这里略过,直接写es新增方法

@SpringBootTest
public class HotelDocumentTest {

    @Autowired
    private IHotelService hotelService; //注入数据库的操作对象
    //声明对象,并做对象初始化连接到es,提高代码复用性
    private RestHighLevelClient client;
    @BeforeEach
    void set(){
        this.client=new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.65.129:9200")//es地址
        ));
    }

    @AfterEach
    void terDown() throws IOException {
        this.client.close();}

@Test //es文档添加
    void addDocumenttest1() throws IOException {
    //先查询到数据库数据,通过id查询,数据库是long类型,所以这里的id是转化了一下
    Hotel byId = hotelService.getById(39106L);
    HotelDoc hotelDoc = new HotelDoc(byId); //这一步就是将Hotel转换为HotelDoc类型,原因上面说过,是为了把数据库的经纬度两个字段拼接成es里的一个字段
    //1、准备Requeat对象
    IndexRequest indexRequest = new IndexRequest("hotel").id(byId.getId().toString());//toString()将long类型转换为字符串类型
    //2、准备json文件
    indexRequest.source(JSON.toJSONString(hotelDoc),XContentType.JSON);//这里将hotelDoc对象转为es的json格式
        //3、发送请求
    client.index(indexRequest,RequestOptions.DEFAULT);
     
    }
}

查询操作

@Test //e三查询文档
    void getDocumenttest() throws IOException {
        //1准备request,指定索引库和要查询的文档id
        GetRequest request = new GetRequest("hotel", "39106");
        //2、发送请求,得到响应
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
        //3、解析响应结果
        String json = response.getSourceAsString(); //转为json字符串
        System.out.println(json);
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);//反序列化成对象
        System.err.println(hotelDoc);
    }

修改操作

@Test //es修改文档
    void updateDocumentest() throws IOException {
        //1、准备request指定索引库和修改的文档id
        UpdateRequest request = new UpdateRequest("hotel","39106");
        //2、准备请求参数,写修改的内容
        request.doc(
                "price","952",
                "city","北京"
        );
        //3、发送请求
        client.update(request,RequestOptions.DEFAULT);
    }

删除操作

@Test //es删除文档
    void deleteDocumentest() throws IOException {
        //1、准备request
        DeleteRequest hotel = new DeleteRequest("hotel", "39106");
        //2、发送请求
        client.delete(hotel,RequestOptions.DEFAULT);
    }

批量数据导入操作

@Test //批量数据导入
    void BulkRequest() throws IOException {
        //1、创建request
        BulkRequest bulkRequest = new BulkRequest();
        //批量查询数据库数据
        List list = hotelService.list();
        //遍历是因为数据库数据较多
        for (Hotel hotel : list) {
            //转换为文档类型
            HotelDoc hotelDoc = new HotelDoc(hotel);
            //2、准备参数,添加多个新增的Request
            bulkRequest.add(new IndexRequest("hotel").
                    id(hotelDoc.getId().toString()).
                    source(JSON.toJSONString(hotelDoc),XContentType.JSON));
        }//这里就是一个链式编程,直接调用了对象的方法,而不像之前是分步写
       

        //不理解遍历的,也可以 自己一条条数据的添加进去,如下,就是很麻烦
/*bulkRequest.add(new IndexRequest("hotel").
                    id("1").
                    source(JSON.toJSONString(hotelDoc),XContentType.JSON));
bulkRequest.add(new IndexRequest("hotel").
                    id("2").
                    source(JSON.toJSONString(hotelDoc),XContentType.JSON));
bulkRequest.add(new IndexRequest("hotel").
                    id("3").
                    source(JSON.toJSONString(hotelDoc),XContentType.JSON));*/
        

 //3、发送请求
        client.bulk(bulkRequest,RequestOptions.DEFAULT);
    }

你可能感兴趣的:(分布式,微服务,elasticsearch,大数据,big,data)