当前位置: 首页 > news >正文

通过官方文档高效学习ElasticSearch的JavaAPI实现!

听说微信搜索《Java鱼仔》会变更强!

本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看!

(一)概述

有人说学习一项技术最好的资料是官方文档,对大部分技术来说确实是这样的。但是官方文档不一定适合每个人去看,比如一个初学者,直接让他看Spring的官方文档,其实是不合适的。今天我会结合ElasticSearch的一个客户端官方文档介绍ES在Java中的API应用。

官方文档不一定好找,这里直接给出地址:

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.6/index.html

你可以选择自己对应版本的文档来参考,我这里选择的是7.6版本,选用的是Java High Level REST Client。

(二)项目搭建

2.1 引入依赖

首先需要创建一个项目,创建项目就不介绍了,引入ES核心依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

为了防止版本问题导致服务器客户端冲突,尽量将ES的版本设置的和自己安装的服务器端版本一致:

<properties>
    <java.version>1.8</java.version>
    <elasticsearch.version>7.6.1</elasticsearch.version>
</properties>

后续还会用一些json和web以及测试的操作,引入这些依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>

2.2 项目基本配置

编写个配置类注入restHighLevelClient对象:

@Configuration
public class ElasticSearchConfig {
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client=new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("192.168.78.128",9200,"http")
                )
        );
        return client;
    }
}

后续会用到实体类,这里先提供了:

@Data
@AllArgsConstructor
public class User {
    private String name;
    private String address;
}

接下来的操作都在SpringBootTest中进行,首先通过@Autowired注入

RestHighLevelClient 对象
@SpringBootTest
class ElasticsearchdemoApplicationTests {
    @Autowired
    private RestHighLevelClient restHighLevelClient;
}

(三)索引API

还是按照学习ES语法的顺序学习语法,找到索引API ,API中的操作很多,我主要选一些重要的讲一下

3.1 创建索引

创建索引的主要对象是CreateIndexRequest

@Test
public void testCreateIndex() throws IOException {
    //创建索引
    CreateIndexRequest request=new CreateIndexRequest("test_index");
    CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
    System.out.println(createIndexResponse.isAcknowledged());
}

创建CreateIndexRequest对象,设置相关属性,比如切片数,副本数,超时时间等等,然后通过restHighLevelClient创建索引,获得一个结果响应。

//设置分片和副本
request.settings(Settings.builder() 
    .put("index.number_of_shards", 3)
    .put("index.number_of_replicas", 2)
);

3.2 获取索引

获取一个索引,主要对象是GetIndexRequest

@Test
public void testGetIndex() throws IOException {
    //获取索引
    GetIndexRequest request=new GetIndexRequest("test_index");
    GetIndexResponse getIndexResponse = restHighLevelClient.indices().get(request, RequestOptions.DEFAULT);
    System.out.println(getIndexResponse);
}

3.3 判断索引是否存在

用的也是GetIndexRequest

@Test
public void testExistsIndex() throws IOException {
    //获取索引
    GetIndexRequest request=new GetIndexRequest("test_index");
    boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
    System.out.println(exists);
}

3.4 删除索引

删除索引的请求对象是DeleteIndexRequest

@Test
public void testDeleteIndex() throws IOException {
    DeleteIndexRequest request=new DeleteIndexRequest("test_index");
    AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
    System.out.println(delete.isAcknowledged());
}

对索引的操作可以通过图形化界面来实现,了解增删改即可。

(四)文档API

文档的API分为单个文档处理和批量文档处理,我会介绍单个文档的增删改查和一个批量文档API

4.1 创建文档

在用语法创建文档的时候,是这样的:

PUT http://ip:port/索引名/类型名/文档id
{
    "name":"javayz",
    "address":"hz"
}

使用代码是这样的:请求对象为IndexRequest

@Test
public void testCreateDoc() throws IOException {
    // PUT http://ip:port/索引名/类型名/文档id
    User user=new User("javayz","hz");
    IndexRequest request=new IndexRequest("text_index");
    request.id("1");
    request.source(JSON.toJSONString(user), XContentType.JSON);
    IndexResponse index = restHighLevelClient.index(request, RequestOptions.DEFAULT);
    System.out.println(index.status());
}

其实两者十分相似,这也是学技术要先学基础的原因。有了基础一看就懂。

4.2 获取文档

获取文档和判断是否存在这里放在一起写,请求对象都是GetRequest :

@Test
public void testGetDoc() throws IOException{
    GetRequest request=new GetRequest("text_index");
    request.id("1");
    boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
    if (exists){
        GetResponse documentFields = restHighLevelClient.get(request, RequestOptions.DEFAULT);
        String sourceAsString = documentFields.getSourceAsString();
        System.out.println(sourceAsString);
    }else{
        System.out.println(exists);
    }
}

4.3 更新文档

更新文档的请求对象是UpdateRequest

@Test
public void testUpdateDoc() throws IOException{
    UpdateRequest request=new UpdateRequest("text_index","1");
    User user=new User("javayz2","hz");
    request.doc(JSON.toJSONString(user),XContentType.JSON);
    UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
    System.out.println(response.status());
}

4.4 删除文档

删除文档的请求对象是DeleteRequest

@Test
public void testDeleteDoc() throws IOException{
    DeleteRequest request=new DeleteRequest("text_index","1");
    DeleteResponse deleteResponse = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
    System.out.println(deleteResponse.status());
}

4.5 批量创建文档

批量创建文档用到了BulkRequest ,具体的使用方式和单体很相似,只不过是把多个请求聚合到一个bulk中一起提交。

@Test
public void testBulkRequest() throws IOException{
    BulkRequest request=new BulkRequest();
    request.timeout("10s");
    ArrayList<User> list=new ArrayList<>();
    list.add(new User("javayz1","hz"));
    list.add(new User("javayz2","hz"));
    //往BulkRequest对象中add文档
    list.stream().forEach(x->{
        request.add(new IndexRequest("text_index").source(JSON.toJSONString(x),XContentType.JSON));
    });

    BulkResponse bulk = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
    System.out.println(bulk.status());
}

(五)查询API

查询操作用最常用的就是match(模糊查询)和term(精确查询),介绍最常用的查询方式:

@Test
public void testSearch() throws IOException {
    SearchRequest request = new SearchRequest("text_index");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    //匹配条件
    MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "javayz1");
    searchSourceBuilder.query(matchQueryBuilder);
    request.source(searchSourceBuilder);
    SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
    System.out.println(search);
}

(六)总结

从上面的用法中可以看出,ES对API的封装使用还算是比较容易,并且官方文档写的也比较清除。下一篇文章我会用上面的这些API实现一个博客系统的搜索功能,我是鱼仔,我们下期再见!

相关文章:

  • 如何在自己的项目中引入ElasticSearch搜索引擎?
  • JSON--百度百科
  • 一个双非本科程序员工作一年的经历
  • guava 并发
  • Oauth2是个什么东西?
  • [javaSE] 看知乎学习工厂模式
  • 数据库分库分表扫盲,不会用也得知道概念
  • 写了那么久的String字符串,你可能根本不懂它!
  • 2012 借教室
  • 怎样才能写出规范的好代码?
  • 让Android Studio支持系统签名
  • 详解Java中的BIO、NIO、AIO
  • 取经阿里十年技术大佬,得到Java线上问题排查攻略!
  • Understanding memory usage on Linux
  • Java中的拦截器和过滤器有什么区别
  • django开发-定时任务的使用
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • flutter的key在widget list的作用以及必要性
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • leetcode388. Longest Absolute File Path
  • Python 反序列化安全问题(二)
  • spring boot下thymeleaf全局静态变量配置
  • Web设计流程优化:网页效果图设计新思路
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 半理解系列--Promise的进化史
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 技术发展面试
  • 面试遇到的一些题
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 使用putty远程连接linux
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • linux 淘宝开源监控工具tsar
  • MyCAT水平分库
  • ​Linux·i2c驱动架构​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #162 (Div. 2)
  • #QT(智能家居界面-界面切换)
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C++)八皇后问题
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (待修改)PyG安装步骤
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)Google的Objective-C编码规范
  • .apk 成为历史!
  • .net 使用ajax控件后如何调用前端脚本
  • .NET和.COM和.CN域名区别
  • .NET框架
  • @KafkaListener注解详解(一)| 常用参数详解
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [Codeforces] combinatorics (R1600) Part.2
  • [dart学习]第四篇:函数