• RestClient操作Elasticsearch(Java)


    Es官方提供了各种不用语言的客户端,用来操作Es,这些客户端的本质就是组装DSL语句,通过http请求发送给Es,从而简化操作

    es基础篇不熟悉参考一下博客:ElasticSearch入门篇-CSDN博客文章浏览阅读445次,点赞7次,收藏3次。Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单个开源的分布式搜索引擎,可以用来实现搜索,日志统计,分析,系统监控等多种功能。https://blog.csdn.net/qq_63837759/article/details/137744756?spm=1001.2014.3001.5501

    环境准备

    我们创建一张hotel-酒店表,然后插入几条数据,基于酒店表做后续的代码书写

    1. SET NAMES utf8mb4;
    2. SET FOREIGN_KEY_CHECKS = 0;
    3. -- ----------------------------
    4. -- Table structure for tb_hotel
    5. -- ----------------------------
    6. DROP TABLE IF EXISTS `tb_hotel`;
    7. CREATE TABLE `tb_hotel` (
    8. `id` bigint NOT NULL COMMENT '酒店id',
    9. `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店名称',
    10. `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店地址',
    11. `price` int NOT NULL COMMENT '酒店价格',
    12. `score` int NOT NULL COMMENT '酒店评分',
    13. `brand` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '酒店品牌',
    14. `city` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '所在城市',
    15. `star_name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '酒店星级,1星到5星,1钻到5钻',
    16. `business` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商圈',
    17. `latitude` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '纬度',
    18. `longitude` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '经度',
    19. `pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '酒店图片',
    20. PRIMARY KEY (`id`) USING BTREE
    21. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;
    22. -- ----------------------------
    23. -- Records of tb_hotel
    24. -- ----------------------------
    25. 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');
    26. 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');
    27. 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');
    28. 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');
    29. SET FOREIGN_KEY_CHECKS = 1;

    接下来基于酒店表的数据结构自行分析创建对应的索引表:

    1. PUT /hotel
    2. {
    3. "mappings": {
    4. "properties": {
    5. "all":{
    6. "type": "text",
    7. "analyzer": "ik_max_word"
    8. },
    9. "id":{
    10. "type": "keyword"
    11. },
    12. "name":{
    13. "type": "text",
    14. "analyzer": "ik_smart",
    15. "copy_to": "all"
    16. },
    17. "address":{
    18. "type": "text",
    19. "index": false
    20. },
    21. "price":{
    22. "type": "long",
    23. "index": false
    24. },
    25. "score":{
    26. "type": "keyword"
    27. },
    28. "brand":{
    29. "type": "keyword",
    30. "copy_to": "all"
    31. },
    32. "city":{
    33. "type": "keyword",
    34. "copy_to": "all"
    35. },
    36. "starName":{
    37. "type": "keyword",
    38. "copy_to": "all"
    39. },
    40. "business":{
    41. "type": "keyword",
    42. "index": false
    43. },
    44. "logitude":{
    45. "type": "geo_point"
    46. },
    47. "pic":{
    48. "type": "keyword"
    49. }
    50. }
    51. }
    52. }

    其中需要注意的是一般搜索酒店会根据名称,城市,评分等多种字段去搜索,每一个字段去创建倒排索引,需要查询很多词,效率低下,于是es支持 我们将这些字段集合到一个自定义的字段中,这个字段不会出现在索引库中,但是查询是按照他来查询。这就是all这个字段的含义。

    使用RestClient来操作索引库

    1,引入es的RestLevelClient

    1. org.elasticsearch.client
    2. elasticsearch-rest-high-level-client

    2,修改es版本

    因为我们使用的springboot他会综艺的管理依赖,而我们使用的springboot管理的es版本和我们使用的es版本不一致,所以我们需要覆盖springboot的es版本

    1. 1.8
    2. 7.12.1

    3,初始化RestLevelClient

    我们这里书写一个测试类完成初始化

    1. @SpringBootTest
    2. public class HotelIndexTest {
    3. private RestHighLevelClient restHighLevelClient;
    4. //初始化es客户端,在代码执行之前先初始化好
    5. @BeforeEach
    6. public void setUp(){
    7. this.restHighLevelClient=new RestHighLevelClient(RestClient.builder(
    8. HttpHost.create("http://192.168.101.100:9200")
    9. ));
    10. }
    11. //销毁
    12. @AfterEach
    13. public void close() throws IOException {
    14. restHighLevelClient.close();
    15. }
    16. }

    4,使用java代码创建索引库

    1. @Test
    2. void createIndex() throws IOException {
    3. //1,创建request请求对象
    4. CreateIndexRequest request = new CreateIndexRequest("索引库名称");
    5. //2,封装请求参数
    6. request.source(IndexMapping.HotelIndexMapping, XContentType.JSON);
    7. //3,发起请求
    8. restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
    9. //restHighLevelClient.search()
    10. }

    5,使用java代码删除索引库

    RestClient实现文档增删改查

    1,增加一条文档

    1. /**
    2. * 插入一条文档
    3. * @throws IOException
    4. */
    5. @Test
    6. void insertWord() throws IOException {
    7. Hotel hotel = hotelService.getById(39106);
    8. //创建request请求对象,设置需要插入的文档的索引名,id
    9. IndexRequest indexRequest=new IndexRequest("hotel").id(hotel.getId().toString());
    10. HotelDoc hotelDoc = new HotelDoc(hotel);
    11. //封装请求参数
    12. indexRequest.source(JSON.toJSONString(hotelDoc),XContentType.JSON);
    13. //发起请求
    14. restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);
    15. }

    2,删除一条文档

    1. /**
    2. * 删除一条文档
    3. * @throws IOException
    4. */
    5. @Test
    6. void deleteWord() throws IOException {
    7. DeleteRequest request=new DeleteRequest("hotel","39106");
    8. DeleteResponse delete = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
    9. System.out.println(delete.getIndex());
    10. }

    3,修改一条文档

    1. /**
    2. * 更新文档
    3. * @throws IOException
    4. */
    5. @Test
    6. void updateWord() throws IOException {
    7. UpdateRequest request=new UpdateRequest("hotel","39106");
    8. Map doc=new HashMap<>();
    9. doc.put("name","修改之后-7天连锁酒店(上海莘庄地铁站店)");
    10. doc.put("price",999);
    11. request.doc(doc);
    12. restHighLevelClient.update(request,RequestOptions.DEFAULT);
    13. }

    4,查询一条文档

    1. /**
    2. * 查询一条文档
    3. * @throws IOException
    4. */
    5. @Test
    6. void searchWord() throws IOException {
    7. //按照id查询文档
    8. GetRequest request=new GetRequest("hotel","39106");
    9. GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
    10. String sourceAsString = response.getSourceAsString();
    11. System.out.println(sourceAsString);
    12. //将查询到的json文档重新解析为java对象
    13. HotelDoc hotelDoc = JSON.parseObject(sourceAsString, HotelDoc.class);
    14. System.out.println(hotelDoc);
    15. //输出当前文档属于那个索引库
    16. String index = response.getIndex();
    17. System.out.println("index:"+index);
    18. //将每个字段输出 例如 score=41, address=闵行莘庄镇七莘路299号
    19. Map source = response.getSource();
    20. System.out.println("source:"+source);
    21. }

    5,批量插入多条文档

    1. /**
    2. * 批量插入多条文档
    3. * @throws IOException
    4. */
    5. @Test
    6. void insertWords() throws IOException {
    7. //只查询十条数据
    8. Page page = new Page<>(2,10);
    9. IPage pageResult = hotelService.page(page);
    10. List hotelList = pageResult.getRecords();
    11. BulkRequest request = new BulkRequest();
    12. hotelList.forEach(hotel -> {
    13. request.add(new IndexRequest("hotel")
    14. .id(hotel.getId().toString())
    15. .source(JSON.toJSONString(hotel),XContentType.JSON));
    16. });
    17. restHighLevelClient.bulk(request,RequestOptions.DEFAULT);
    18. }

    至此,使用RestClient对es基本操作完结!!!

  • 相关阅读:
    uniapp HBuilder 无法运行微信小程序的问题解决
    Quarkus 集成 mailer 使用 easyexcel 发送表格邮件
    SqlServer安装教程
    路由模式和打包优化
    Python运维之 Flask + 宝塔运行小应用
    前段导出XLSX表格
    WebAssembly入门笔记[1]:与JavaScript的交互
    会计电子档案系统方案
    ERROR: your rosdep installation has not been initialized yet
    带团队后的日常思考(九)
  • 原文地址:https://blog.csdn.net/qq_63837759/article/details/137755058