• 【Elasticsearch】es基础入门-03.RestClient操作文档


    RestClient操作文档

    示例:

    一.初始化JavaRestClient

    (一)引入es的RestHighLevelClient依赖

    <!--elasticsearch-->
    <dependency>
    	<groupId>org.elasticsearch.client</groupId>
    	<artifactId>elasticsearch-rest-high-level-client</artifactId>
    </dependency>
    

    (二)因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本:

    <properties>
    	<elasticsearch.version>7.17.21</elasticsearch.version>
    </properties>
    

    (三)新建一个测试类,初始化JavaRestClient

    public class HotelDocumentTest {
        
        private RestHighLevelClient client;
    
        @BeforeEach
        void setUp() {
            client = new RestHighLevelClient(RestClient.builder(
                    HttpHost.create("http://192.168.174.129:9200")
            ));
        }
       
        @AfterEach
        void tearDown() throws IOException {
            client.close();
        }
    }
    

    二.添加酒店数据到文档

    (一)数据库文件

    -- ----------------------------
    -- 创建表
    -- ----------------------------
    DROP TABLE IF EXISTS `tb_hotel`;
    CREATE TABLE `tb_hotel`  (
      `id` bigint(20) NOT NULL COMMENT '酒店id',
      `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店名称',
      `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店地址',
      `price` int(10) NOT NULL COMMENT '酒店价格',
      `score` int(2) NOT NULL COMMENT '酒店评分',
      `brand` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店品牌',
      `city` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '所在城市',
      `star_name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '酒店星级,1星到5星,1钻到5钻',
      `business` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商圈',
      `latitude` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '纬度',
      `longitude` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '经度',
      `pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '酒店图片',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- 插入一点数据
    -- ----------------------------
    INSERT INTO `tb_hotel` VALUES (36934, '7天连锁酒店(上海宝山路地铁站店)', '静安交通路40号', 336, 37, '7天酒店', '上海', '二钻', '四川北路商业区', '31.251433', '121.47522', 'https://m.tuniucdn.com/fb2/t1/G1/M00/3E/40/Cii9EVkyLrKIXo1vAAHgrxo_pUcAALcKQLD688AAeDH564_w200_h200_c1_t0.jpg');
    INSERT INTO `tb_hotel` VALUES (38609, '速8酒店(上海赤峰路店)', '广灵二路126号', 249, 35, '速8', '上海', '二钻', '四川北路商业区', '31.282444', '121.479385', 'https://m.tuniucdn.com/fb2/t1/G2/M00/DF/96/Cii-TFkx0ImIQZeiAAITil0LM7cAALCYwKXHQ4AAhOi377_w200_h200_c1_t0.jpg');
    INSERT INTO `tb_hotel` VALUES (38665, '速8酒店上海中山北路兰田路店', '兰田路38号', 226, 35, '速8', '上海', '二钻', '长风公园地区', '31.244288', '121.422419', 'https://m.tuniucdn.com/fb2/t1/G2/M00/EF/86/Cii-Tlk2mV2IMZ-_AAEucgG3dx4AALaawEjiycAAS6K083_w200_h200_c1_t0.jpg');
    INSERT INTO `tb_hotel` VALUES (38812, '7天连锁酒店(上海漕溪路地铁站店)', '徐汇龙华西路315弄58号', 298, 37, '7天酒店', '上海', '二钻', '八万人体育场地区', '31.174377', '121.442875', 'https://m.tuniucdn.com/fb2/t1/G2/M00/E0/0E/Cii-TlkyIr2IEWNoAAHQYv7i5CkAALD-QP2iJwAAdB6245_w200_h200_c1_t0.jpg');
    INSERT INTO `tb_hotel` VALUES (39106, '7天连锁酒店(上海莘庄地铁站店)', '闵行莘庄镇七莘路299号', 348, 41, '7天酒店', '上海', '二钻', '莘庄工业区', '31.113812', '121.375869', 'https://m.tuniucdn.com/fb2/t1/G2/M00/D8/11/Cii-T1ku2zGIGR7uAAF1NYY9clwAAKxZAHO8HgAAXVN368_w200_h200_c1_t0.jpg');
    INSERT INTO `tb_hotel` VALUES (39141, '7天连锁酒店(上海五角场复旦同济大学店)', '杨浦国权路315号', 349, 38, '7天酒店', '上海', '二钻', '江湾、五角场商业区', '31.290057', '121.508804', 'https://m.tuniucdn.com/fb2/t1/G2/M00/C7/E3/Cii-T1knFXCIJzNYAAFB8-uFNAEAAKYkQPcw1IAAUIL012_w200_h200_c1_t0.jpg');
    INSERT INTO `tb_hotel` VALUES (45845, '上海西藏大厦万怡酒店', '虹桥路100号', 589, 45, '万怡', '上海', '四钻', '徐家汇地区', '31.192714', '121.434717', 'https://m.tuniucdn.com/fb3/s1/2n9c/48GNb9GZpJDCejVAcQHYWwYyU8T_w200_h200_c1_t0.jpg');
    INSERT INTO `tb_hotel` VALUES (45870, '上海临港豪生大酒店', '新元南路555号', 896, 45, '豪生', '上海', '四星级', '滴水湖临港地区', '30.871729', '121.81959', 'https://m.tuniucdn.com/fb3/s1/2n9c/2F5HoQvBgypoDUE46752ppnQaTqs_w200_h200_c1_t0.jpg');
    INSERT INTO `tb_hotel` VALUES (46829, '上海浦西万怡酒店', '恒丰路338号', 726, 46, '万怡', '上海', '四钻', '上海火车站地区', '31.242977', '121.455864', 'https://m.tuniucdn.com/fb3/s1/2n9c/x87VCoyaR8cTuYFZmKHe8VC6Wk1_w200_h200_c1_t0.jpg');
    INSERT INTO `tb_hotel` VALUES (47066, '上海浦东东站华美达酒店', '施新路958号', 408, 46, '华美达', '上海', '四钻', '浦东机场核心区', '31.147989', '121.759199', 'https://m.tuniucdn.com/fb3/s1/2n9c/2pNujAVaQbXACzkHp8bQMm6zqwhp_w200_h200_c1_t0.jpg');
    INSERT INTO `tb_hotel` VALUES (47478, '速8酒店(上海松江中心店)', '松江荣乐东路677号', 428, 35, '速8', '上海', '二钻', '佘山、松江大学城', '31.016712', '121.261606', 'https://m.tuniucdn.com/filebroker/cdn/res/07/36/073662e1718fccefb7130a9da44ddf5c_w200_h200_c1_t0.jpg');
    
    

    (二)实体类

    索引库实体类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;
    }
    

    文档实体类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();
        }
    }
    

    (三)mapper层

    public interface HotelMapper extends BaseMapper<Hotel> {
    }
    

    (四)service层

    1

    public interface IHotelService extends IService<Hotel> {
    }
    

    2

    @Service
    public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {
    }
    

    (五)测试类编写

    @SpringBootTest
    public class HotelDocumentTest {
        
        private RestHighLevelClient client;
    
        @Autowired
        private IHotelService hotelService;
        
        @BeforeEach
        void setUp() {
            client = new RestHighLevelClient(RestClient.builder(
                //注意:这里的IP地址是es的地址
                    HttpHost.create("http://192.168.174.129:9200")
            ));
        }
       
        @Test
    	void testAddDocument() throws IOException {
            //根据id查询酒店信息
            Hotel hotel = hotelService.getById(39106L);
            //转换为文档类型
            HotelDoc hotelDoc = new HotelDoc(hotel);
            
            //1.准备Request对象  索引库名称和文档id
            IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());
            //2.准备Json文档
            request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);
            //3.发送请求
            client.index(request,RequestOptions.DEFAULT);
    	}
        
        @AfterEach
        void tearDown() throws IOException {
            client.close();
        }
    }
    

    三.创建文档的结果

    运行测试类后:

    在这里插入图片描述

    在es可视化平台elastic上,查看创建的文档

    GET /hotel/_doc/39106
    

    在这里插入图片描述

    四.根据id查询酒店数据

    @Test
    void testGetDocumentById() throws IOException {
        // 1.准备Request      // GET /hotel/_doc/{id}
        GetRequest request = new GetRequest("hotel", "39106");
        // 2.发送请求
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
        // 3.解析响应结果
        String json = response.getSourceAsString();
    	
        //json反序列化
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        System.out.println("hotelDoc = " + hotelDoc);
    }
    

    运行后

    在这里插入图片描述

    五.根据id修改酒店数据

    方式一:全量更新。先删除旧文档,再创建新的文档

    方式二:局部更新。只更新部分字段

    @Test
    void testUpdateById() throws IOException {
        // 1.准备Request
        UpdateRequest request = new UpdateRequest("hotel", "39106");
        // 2.准备参数
        request.doc(
                "price", "870",
            	"starName","五星"
        );
        // 3.发送请求
        client.update(request, RequestOptions.DEFAULT);
    }
    

    先运行修改,再运行查询,结果如下:

    在这里插入图片描述

    六.根据id删除文档

    @Test
    void testDeleteDocument() throws IOException {
        //1.准备Request
        DeleteRequest request = new DeleteRequest("hotel","39106");
        //2.发送请求
        client.delete(request,RequestOptions.DEFAULT)
    }
    

    先运行删除,再运行查询,结果如下:

    在这里插入图片描述

    七.RestClient批量导入酒店数据到ES

    @Test
    void testBulkRequest() throws IOException {
        // 查询所有的酒店数据
        List<Hotel> list = hotelService.list();
    
        // 1.准备Request
        BulkRequest request = new BulkRequest();
        
        // 2.准备参数
        for (Hotel hotel : list) {
            // 2.1.转为文档类型HotelDoc
            HotelDoc hotelDoc = new HotelDoc(hotel);
            // 2.2.转json
            String json = JSON.toJSONString(hotelDoc);
            // 2.3.添加请求
            request.add(new IndexRequest("hotel")
                        .id(hotel.getId().toString())
                        .source(json, XContentType.JSON));
         }
    
         // 3.发送请求
         client.bulk(request, RequestOptions.DEFAULT);
    }
    

    运行后

    在这里插入图片描述

    在es可视化平台elastic上,查看所有文档

    GET /hotel/_search
    

    在这里插入图片描述

  • 相关阅读:
    conda配置完整的pytorch虚拟环境
    jQuery DOM基础操作
    muduo源码剖析之TcpServer服务端
    【JS缓存技术】-本地存储
    浅谈c/c++中main(),int main(),void main(),int main(void)四者之间的区别
    虚拟现实(VR)游戏与增强现实(AR)游戏的区别
    奥康的高尔夫鞋,圈不住投资者的心
    开发家政小程序的优点
    苹果电脑误删文件怎么找回?苹果电脑删了文件能恢复吗?苹果电脑文件删除怎么恢复
    svg学习 路由跳转方式以及传(获取)参 路由获取参数 懒加载
  • 原文地址:https://blog.csdn.net/qq_73639699/article/details/139418134