目录
2.3.1引入es的RestHighLevelClient的依赖
1.什么是RestClient
ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址: https://www.elastic.co/guide/en/elasticsearch/client/index.html
2.RestClient测试
2.1项目搭建
2.1.1创建springboot项目
2.1.2导入相关依赖
2.1.3配置项目文件
注意以下自己的数据库名称
2.1.4数据库表结构建立
这里写好了sql语句,直接使用即可
CREATE TABLE `tb_hotel` (
`id` bigint(20) NOT NULL COMMENT '酒店id',
`name` varchar(255) NOT NULL COMMENT '酒店名称',
`address` varchar(255) NOT NULL COMMENT '酒店地址',
`price` int(10) NOT NULL COMMENT '酒店价格',
`score` int(2) NOT NULL COMMENT '酒店评分',
`brand` varchar(32) NOT NULL COMMENT '酒店品牌',
`city` varchar(32) NOT NULL COMMENT '所在城市',
`star_name` varchar(32) NOT NULL COMMENT '酒店星级',
`business` varchar(255) NOT NULL COMMENT '商圈',
`latitude` varchar(32) NOT NULL COMMENT '纬度',
`longitude` varchar(32) NOT NULL COMMENT '经度',
`pic` varchar(510) NOT NULL COMMENT '酒店图片',
primary key (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO tb_hotel VALUES (60363,'上海新世界丽笙大酒店','南京西路88号',1431,46,'丽笙','上海','五星级','人民广场地区','31.23462','121.47327','TEST');
INSERT INTO tb_hotel VALUES (60398,'上海复旦皇冠假日酒店','邯郸路199号',924,47,'皇冠假日','上海','五星级','江湾/五角场商业区','31.295382','121.502547','TEST');
INSERT INTO tb_hotel VALUES (60487,'上海外滩茂悦大酒店','黄浦路199号',689,44,'君悦','上海','五星级','外滩地区','31.245409.','121.492969','TEST');
INSERT INTO tb_hotel VALUES (60522,'上海嘉豪淮海国际豪生酒店','汾阳路1号',425,45,'嘉豪','上海','四钻','淮海路/新天地地区','31.215497','121.456297','TEST');
INSERT INTO tb_hotel VALUES (60916,'上海绿地万怡酒店','沪宜公路3101号',328,45,'万怡','上海','四钻','嘉定新城','31.368523','121.258567','TEST');
INSERT INTO tb_hotel VALUES (60922,'上海虹桥祥源希尔顿酒店','红松东路1116号',1108,45,'希尔顿','上海','五钻','虹桥地区','31.18746','121.395312','TEST');
INSERT INTO tb_hotel VALUES (60935,'上海虹口三至喜来登酒店','四平路59号',1899,46,'喜来登','上海','五星级','四川北路商业区','31.2579','121.487954','TEST');
INSERT INTO tb_hotel VALUES (61075,'上海雅居乐万豪酒店','西藏中路555号',1152,46,'万豪','上海','五钻','人民广场地区','31.236681','121.473529','TEST');
INSERT INTO tb_hotel VALUES (61083,'上海滴水湖皇冠假日酒店','自由贸易试验区临港新片区2号',971,44,'皇冠假日','上海','五钻','滴水湖临港地区','30.890867','121.473529','TEST');
INSERT INTO tb_hotel VALUES (62091,'杭州君悦酒店','湖滨路28号',260,47,'君悦','杭州','五钻','西湖湖滨商圈','30.254862','121.473529','TEST');
INSERT INTO tb_hotel VALUES (62605,'杭州西溪喜来登度日大酒店','紫金港路西溪天堂国际旅游区56号',1186,47,'喜来登','杭州','五星级','西溪湿地商圈','30.267639','121.473529','TEST');
INSERT INTO tb_hotel VALUES (309208,'北京王府井希尔顿酒店','王府井东街8号',1679,46,'希尔顿','北京','五星级','天安门/王府井地区','39.914539','121.473529','TEST');
INSERT INTO tb_hotel VALUES (394559,'北京东方君悦大酒店','长安街1号东方广场',689,45,'君悦','北京','四星级','天安门/王府井地区','39.909635','121.473529','TEST');
INSERT INTO tb_hotel VALUES (394557,'北京宝辰饭店','建国门内大街甲18号',425,44,'宝辰','北京','五钻','北京站/建国门地区','39.905768','121.473529','TEST');
INSERT INTO tb_hotel VALUES (394617,'北京新云南皇冠假日酒店','东北三环西坝河太阳宫桥东路18号',328,46,'皇冠假日','北京','五星级','国展中心地区','39.972409','121.473529','TEST');
INSERT INTO tb_hotel VALUES (395434,'北京希尔顿酒店','东三环北路东方路1号',1108,45,'希尔顿','北京','五星级','燕莎/朝阳公园商业区','39.952703','121.473529','TEST');
INSERT INTO tb_hotel VALUES (396702,'北京首都机场希尔顿酒店','首都机场3号航站楼三经路1号',1899,46,'希尔顿','北京','五钻','天安门/王府井地区','40.048969','121.473529','TEST');
INSERT INTO tb_hotel VALUES (395787,'北京海航大厦万豪酒店','霄云路甲26号',1152,46,'万豪','北京','五钻','燕莎/朝阳公园商业区','39.959861','116.372327','TEST');
INSERT INTO tb_hotel VALUES (395799,'北京国际艺苑皇冠假日酒店','王府井大街48号',971,44,'皇冠假日','北京','五星级','天安门/王府井地区','39.918994','116.372327','TEST');
INSERT INTO tb_hotel VALUES (395815,'北京明豪华美达酒店','天竺镇府前一街13号',260,46,'美达','北京','四钻','首都机场/新国展地区','40.062832','116.372327','TEST');
INSERT INTO tb_hotel VALUES (396189,'北京照样悠唐皇冠假日酒店','三丰北里号',1186,46,'皇冠假日','北京','五钻','三里屯/工体/东直门地区','39.92129','116.372327','TEST');
INSERT INTO tb_hotel VALUES (396471,'维也纳酒店','海淀北太平花园路甲17号',1679,36,'维也纳','北京','三钻','马甸/安贞地区','39.970837','116.4099','TEST');
INSERT INTO tb_hotel VALUES (396506,'北京金隅喜来酒店','北三环东路36号',686,47,'金隅喜来','北京','五星级','马甸/安贞地区','39.967163','116.421879','TEST');
INSERT INTO tb_hotel VALUES (413460,'7天连锁酒店(北京天坛店)','东城天坛东里甲36号',418,38,'7天连锁','北京','二钻','前门/崇文门商贸区','39.875786','116.372327','TEST');
INSERT INTO tb_hotel VALUES (413476,'7天连锁酒店(北京南站店)','丰台马家堡西路22号',485,37,'7天连锁','北京','二钻','永定门/南站/大红门','39.845364','116.374982','TEST');
INSERT INTO tb_hotel VALUES (414168,'7天连锁酒店(北京西直门店)','西城平安里西大街翠花街264号',419,37,'7天连锁','北京','二钻','西单/金融街地区','39.931338','116.364982','TEST');
在数据库中运行sql文件,然后表就建好了
2.1.5项目结构准备
结构图如下:
mapper文件,通过mybatisplus实现了:
pojo文件:
service:
service.impl:
2.2分析数据结构
mapping要考虑的问题:
字段名、数据类型、是否参与搜索、是否分词、如果分词,分词器是什么?
举个栗子:我们上面创建好了的hotel表,里面的哪些字段需要我们去分词?
前置注意项:
ES中支持两种地理坐标数据类型:
1. gegpoint:由纬度(latitude)和经度( longitude)确定的一个点。例如:"32.8752345,120.2981576"
2. geo_shape:有多个geo_point组成的复杂几何图形。例如一条直线,
"LINESTRING(-77.03653 38.897676,-77.00905138.889939)"
字段拷贝可以使用copy_to属性将当前字段拷贝到指定字段。示例:
"score": {
"type": "integer"
},
"brand": {
"type": "keyword","copy_to": "all"
},
简单的理解,keyword就是不需要分词的字符串内容,text是需要分词的字符串内容,index 如果是true则代表需要被搜索,false是不需要被搜索.
如果我们想通过传入一个字段去同时搜索多个字段,是要一个一个去匹配搜索就会显得非常麻烦,还好我们可以使用copy_to来解决这个问题
可以看到我们在properties里增加了一个all字段,在其他字段中通过copy_to将其它字段拷贝到all字段
上面的是图片喔,这么贴一下代码:
PUT /hotel
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"name": {
"type": "text",
"analyzer": "ik_max_word",
"copy_to": "all"
},
"address": {
"type": "keyword",
"index": false
},
"price": {
"type": "integer"
},
"score": {
"type": "integer"
},
"brand": {
"type": "keyword",
"copy_to": "all"
},
"city": {
"type": "keyword"
},
"starName": {
"type": "keyword"
},
"business": {
"type": "keyword",
"copy_to": "all"
},
"location": {
"type": "geo_point"
},
"pic": {
"type": "keyword",
"index": false
},
"all": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
2.3初始化JavaRestClient
2.3.1引入es的RestHighLevelClient的依赖
大家要根据自己安装的版本去选择!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.3.2初始化RestHighLevelClient
这里可以先做个测试
private RestHighLevelClient client;
@BeforeEach
void setup () {
this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://127.0.0.1:9200")));
}
@AfterEach
void teardown () throws IOException {
this.client.close();
}
@Test
public void testInit () {
System.out.println(client);
}
启动测试,输出结果:
2.4索引库操作
2.4.1创建索引库
下面是创建一个索引库的基本步骤:
MAPPING_TEMPLATE就是我们新增一个索引库的DSL语言,也就是被{}包裹起来的那部分,包括“{}”在内
在启动之前呢,从浏览器中检查一下有没有这个索引:
啊哈,结果当然是没有,那我们启动一下
得到结果:
我们去浏览器上看一下:
可以看出hotel这个索引库创建成功了!
2.4.2删除索引库
同样道理就不多说了
2.4.3判断索引库是否存在
经过2.4.2的删除操作后:
2.5文档操作
2.5.1新增文档
步骤很类似,这边为了方便,我们从之前在数据库里存好的数据随便取一个id的hotel对象,将这个hotel对象json化之后插入模板,然后打入请求
(为什么要将对象json化呢?因为它支持json格式的数据)
这个JSON依赖在哪呢,可以看这里
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
在浏览器中查看结果:
2.5.2查看文档
根据id查找的文档是json数据,需要我们反序列化得到对象
2.5.3更新文档
先记住原来的数据,我们现在就要进行修改了
代码如下,需要修改的数据像数组这样依序代入方法
在浏览器中查看结果
可以看到修改成功!
2.5.4删除文档
看到这里相信读者已经非常明白了,剩下的就自己探索吧!
2.5.5批量导入文档
当然,restclient也为我们提供了批量操作方法,代码如下,只是部分不同:
在浏览器中查看结果:
本专栏持续更新中......