目录
在B站学习了狂神的ElasticSearch的教学视频,顺便记录一下自己的学习这个知识的过程,因为没有狂神笔记,下面的都是自己手敲的,很多学习思路都是借鉴狂神,代码编写也是,想看怎么学习ElasticSearch的小伙伴可以去看看狂神怎么学习的,狂神也不仅说了ES,还有很多内容,我只是简单的整合,不说了,开冲把(代码链接在文章末尾)
1、新建工程
选择相关依赖:
保证导入的依赖要和es的版本一致,自定义版本依赖:
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.4.1</elasticsearch.version>
</properties>
2、新建ElasticSearchClientConfig配置类
从ElasticSearch官方文档文档中找到如下内容
一般都选用这个Java REST Client [7.9] — other versions,记住要跟自己ES版本号一样哈
然后:
找到初始化:
将下面这段代码复制到我们的配置类中,这里更重要的是记录学习方法,代码只会粘贴复制是还不够的
配置类主要代码:
@Configuration //相当于xml
public class ElasticSearchClientConfig {
/**
* spring <bean id="restHighLevelClient"
class = "RestHighLevelClient">
*/
@Bean
public RestHighLevelClient restHighLevelClient(){
// RestHighLevelClient:高级客户端
RestHighLevelClient client = new RestHighLevelClient(
//这里我就演示一个连接
RestClient.builder(
new HttpHost("localhost", 9200, "http"));
// new HttpHost("localhost", 9201, "http")));
return client;
}
}
3、关于编写索引的测试类
1、在测试类中添加配置类属性
/**
* 引用测试类
* @Autowired 是默认根据类型匹配
* @Qualifier 类型匹配后再找方法名,这样就确定我们找到的注入到的
* bean是我们自定义的
*/
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client;
2、测试创建索引方法
/**
* 创建索引 request,面向对象来操作
*/
@Test
public void test01(){
//发起创建索引请求,索引 ---> 数据库 索引必须是小写哈~
CreateIndexRequest request =
new CreateIndexRequest("Vinda_index");
//es服务器执行请求 indicesClient , 请求后获得对应响应
CreateIndexResponse response = null;
try {
response = client
.indices().create(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
System.out.println("请求发生异常!!!");
}
System.out.println("response:"+response);
}
运行成功后的结果:打开Elasticsearch-head,输入:http://IP:9100/
查看到运行结果,成功添加:
之后的查询和删除都是在官方文档都有提示,我们可以根据文档来学习的:
ES官方AIP使用文档
代码也写出了:
/**
* 获取索引 request
*/
@Test
public void test02(){
//发起获取引请求,索引 ---> 数据库 索引必须是小写哈~
GetIndexRequest request = new GetIndexRequest("vinda_index");
//es服务器执行请求 indicesClient , 请求后获得对应响应
try {
boolean b = client
.indices().exists(request, RequestOptions.DEFAULT);
if(b) System.out.println("是否存在:"+b);
else System.out.println("是否存在:"+b);
} catch (IOException e) {
e.printStackTrace();
System.out.println("请求发生异常!!!");
}
}
/**
* 删除索引
*/
@Test
public void test03(){
//发起删除引请求,索引 ---> 数据库 索引必须是小写哈~
DeleteIndexRequest request =
new DeleteIndexRequest("vinda_index");
//es服务器执行请求 indicesClient , 请求后获得对应响应
try {
AcknowledgedResponse b = client.indices().delete(request, RequestOptions.DEFAULT);
if(b.isAcknowledged()) System.out.println("是否删除成功:"+b);
else System.out.println("是否删除成功:"+b);
} catch (IOException e) {
e.printStackTrace();
System.out.println("请求发生异常!!!");
}
}
4、关于文档的api测试
1、先新建entity实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private String sname;
private Integer sage;
}
2、添加测试方法
/**
* 类型 --> 相当于数据表
* 添加文档 --> 相当于数据段
*/
@Test
public void test04(){
//创建对象
Student student = new Student("vinda",21);
//创建请求
IndexRequest request = new IndexRequest("vinda_index");
//规则输入 put /vinda_index/1;
request.id("1");
request.timeout(TimeValue.timeValueSeconds(1));
request.timeout("1s");
//将数据放入到请求 student - > json
request.source
(JSON.toJSONString(student), XContentType.JSON);
//客户端发送请求,获取响应结果
IndexResponse response = null;
try {
response = client.index(request, RequestOptions.DEFAULT);
System.out.println("本次响应结果:"+response.toString());
System.out.println("本次执行状态:"+response.status());
} catch (IOException e) {
e.printStackTrace();
System.out.println("本次请求出现异常");
}
}
成功提示:状态为 create
3、获取文档内容测试
/**
获取文档
*/
@Test
public void test05(){
// get /vinda_index/1
GetRequest request = new GetRequest("vinda_index","1");
//不获取返回的 _source 的上下文
request.fetchSourceContext(new FetchSourceContext((false)));
try {
boolean b = client
.exists(request, RequestOptions.DEFAULT);
if(b) {
System.out.println("请求成功");
//获取文档内容
GetResponse response = client
.get(request,RequestOptions.DEFAULT);
//获取文档内容,里面有soure 、 version等方法
System.out.println(response);
//打印文档内容
System.out.println(response.getSourceAsString());
}
else System.out.println("请求失败哦");
} catch (IOException e) {
e.printStackTrace();
System.out.println("本次请求出现异常");
}
}
请求成功截图:
更新文档:
@Test
public void test06(){
UpdateRequest updateRequest
= new UpdateRequest("vinda_index","1");
//设置超时时间
updateRequest.timeout("1S");
//放入需要更新的对象
Student student = new Student("VINDA",22);
//更新
updateRequest.doc(JSON.toJSONString(student),
XContentType.JSON);
//发送更新请求
try {
UpdateResponse update = client
.update(updateRequest, RequestOptions.DEFAULT);
System.out.println("更新是否成功:"+update.status());
} catch (IOException e) {
e.printStackTrace();
}
}
4、删除文档
@Test
public void test07(){
DeleteRequest deleteRequest
= new DeleteRequest("vinda_index","1");
deleteRequest.timeout("1S");
try {
DeleteResponse deleteResponse
= client.delete(deleteRequest,RequestOptions.DEFAULT);
System.out.println("删除是否成功:"+deleteResponse.status());
} catch (IOException e) {
e.printStackTrace();
}
}
5、大量插入数据
@Test
public void test08(){
BulkRequest bulkRequest = new BulkRequest();
//因为大量插入数据,我们应该考虑设置的时间久一点
bulkRequest.timeout("10S");
List<Student> students = new ArrayList<>();
students.add(new Student("vinda1",22));
students.add(new Student("vinda2",23));
students.add(new Student("vinda3",24));
students.add(new Student("weida1",25));
students.add(new Student("weida1",25));
//插入
for (int i = 0; i < students.size() ; i++) {
bulkRequest.add(
new IndexRequest("vinda_index").id(""+(i+1))
.source(JSON.toJSONString((students.get(i))),XContentType.JSON));
}
//查看返回状态
try {
BulkResponse bulkResponse = client.bulk(bulkRequest,RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures()); //是否成功
} catch (IOException e) {
System.out.println("批量添加失败!!!");
}
}
flase代表成功
6、大量查询
可以新建一个工具类,类种添加常用的ES数据信息
public class ESconst {
public static final String ES_INDEX = "vinda_index";
}
查询代码
/**
* 查询:搜索请求,条件构造
* SearchRequest 搜索请求
* SearchSourceBuilder条件构造
* HighlightBuilder 构建高亮
* TermQueryBuilder精确查询
* MatchAl LQueryBuilder
* xxx QueryBuilder 对应我们刚才看到索引命令
*/
@Test
public void test09(){
SearchRequest searchRequest
= new SearchRequest(ESconst.ES_INDEX);
//构建搜索条件
SearchSourceBuilder sBuilder
= new SearchSourceBuilder();
//查询条件,我们可以使用QueryBuilders工具来实现
//QueryBuilder.termQuery 精确
//QueryBuilders.matchAllQuery() 匹配所有
//1、查询sname = weida的数据
TermQueryBuilder termQueryBuilder
= QueryBuilders.termQuery("sname", "weida1");
//2、装载查询条件到构造器中
sBuilder.query(termQueryBuilder);
//3、设置超时时 秒级
sBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
//4、发送查询请求
searchRequest.source(sBuilder);
//5、查看返回结果
try {
SearchResponse searchResponse
= client.search(searchRequest,RequestOptions.DEFAULT);
//System.out.println(JSON.toJSONString(searchResponse.getHits()));
//遍历结果
for (SearchHit hit : searchResponse.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
System.out.println("查询完毕!!!");
} catch (IOException e) {
e.printStackTrace();
System.out.println("返回数据有误!!!");
}
/**
* matchAllQuery源码
* matchAllQuery的属性
* NAME = "match_all";
* ObjectParser<MatchAllQueryBuilder, Void> PARSER = new ObjectParser("match_all", MatchAllQueryBuilder::new);
*/
System.out.println("全部查询:");
//1、查询所有
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
//2、装载查询条件到构造器中
sBuilder.query(matchAllQueryBuilder);
//3、设置超时时 秒级
sBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
//4、发送查询请求
searchRequest.source(sBuilder);
//5、查看返回结果
try {
SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
//System.out.println(JSON.toJSONString(searchResponse.getHits()));
//遍历结果
for (SearchHit hit : searchResponse.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
System.out.println("查询完毕!!!");
} catch (IOException e) {
e.printStackTrace();
System.out.println("返回数据有误!!!");
}
}
查询结果:
5、小结
这只是简单的ElasticSearch整合,还有如何实现高亮、爬取数据等都还没整理,学习路上是不能停歇的,加油吧,共勉,小白写得不好地方欢迎评论区留言讨论,嘿嘿~
-----------------------代码冲呀!!!!点我去Github-----------------------