前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 操作 ElasticSearch

Java 操作 ElasticSearch

作者头像
wsuo
发布2020-07-31 15:48:09
7760
发布2020-07-31 15:48:09
举报
文章被收录于专栏:技术进阶之路技术进阶之路

一、ElasticSearch 集成 SpringBoot

首先是依赖问题,导入依赖之后会有版本问题:

SpringBoot 2.3.0 支持 7.6.2版本,但是我不是最新的版本,所以自定义版本:

代码语言:javascript
复制
<properties>
        <java.version>1.8</java.version>
        <elasticsearch>7.6.1</elasticsearch>
</properties>

我们先创建一个配置类:

代码语言:javascript
复制
@Configuration
public class EsConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        return new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")));
    }
}

在测试类中测试:

代码语言:javascript
复制
@Test
void testCreatedIndex() throws IOException {
    // 1.创建索引请求
    CreateIndexRequest request = new CreateIndexRequest("test3");
    // 2.客户端执行请求,获取响应
    CreateIndexResponse response = restHighLevelClient.indices()
            .create(request, RequestOptions.DEFAULT);
    System.out.println(response);
}

打印结果:

代码语言:javascript
复制
org.elasticsearch.client.indices.CreateIndexResponse@6a5dc80

并且成功创建 test3

这就说明我们的配置成功了。

二、关于索引的 API 测试

之前已经演示了创建索引了,下面来看一下其他的 API:

测试索引是否存在

代码语言:javascript
复制
/**
 * 测试索引是否存在
 * @throws IOException exists 会抛出异常
 */
@Test
void testExistIndex() throws IOException {
    GetIndexRequest request = new GetIndexRequest("test3");
    boolean exists = restHighLevelClient.indices()
            .exists(request, RequestOptions.DEFAULT);
    System.out.println(exists);
}

测试删除索引

代码语言:javascript
复制
/**
* 测试删除索引
* @throws IOException
*/
@Test
void testDeleteIndex() throws IOException {
   DeleteIndexRequest request = new DeleteIndexRequest("test3");
   AcknowledgedResponse response = restHighLevelClient.indices()
           .delete(request, RequestOptions.DEFAULT);
   System.out.println(response.isAcknowledged());
}

然后再去看发现 test3 已经没了。

三、关于文档的 API 测试

首先建一个实体类:

代码语言:javascript
复制
@Data
@Component
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User implements Serializable {
    private String name;
    private Integer age;
}

创建文档:

代码语言:javascript
复制
/**
 * 测试添加文档
 *
 * @throws IOException 异常
 */
@Test
void testAddDocument() throws IOException {
    // 创建对象
    User user = new User("WSuo", 18);
    // 创建请求
    IndexRequest request = new IndexRequest("test3");
    // 设置规则 put /test3/_doc/1
    request.id("1");
    // 将数据放入请求 json
    request.source(JSON.toJSONString(user), XContentType.JSON);
    // 客户端发送请求
    IndexResponse indexResponse = restHighLevelClient
            .index(request, RequestOptions.DEFAULT);
    System.out.println(indexResponse.status());
}

结果:

代码语言:javascript
复制
CREATED

查询之后发现已经插进去了。

测试文档是否存在

代码语言:javascript
复制
/**
 * 测试文档是否存在
 */
@Test
void testIsExist() throws IOException {
    GetRequest request = new GetRequest("test3", "1");
    request.fetchSourceContext(new FetchSourceContext(false)).storedFields("_none_");
    boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
    System.out.println(exists);
}
  • new FetchSourceContext(false)):表示不返回 _source 上下文了

获取文档的信息 get /test3/_doc/1

代码语言:javascript
复制
/**
* 获取文档的信息 get test3/_doc/1
*/
@Test
void testGetDocument() throws IOException {
   GetRequest request = new GetRequest("test3", "1");
   GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
   System.out.println(response.getSourceAsString());
}

结果是:

代码语言:javascript
复制
{"age":18,"name":"WSuo"}

更新文档信息 post /test3/_doc/1/_update

代码语言:javascript
复制
/**
 * 更新文档信息 post /test3/_doc/1/_update
 * @throws IOException 异常
 */
@Test
void testUpdateDocument() throws IOException {
    UpdateRequest request = new UpdateRequest("test3", "1");
    User user = new User("wSuo", 19);
    request.doc(JSON.toJSONString(user), XContentType.JSON);
    UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
    System.out.println(response.status());
}

删除文档信息 delete /test3/_doc/2

代码语言:javascript
复制
/**
 * 删除文档信息 delete /test3/_doc/2
 * @throws IOException 异常
 */
@Test
void testDeleteDocument() throws IOException {
    DeleteRequest request = new DeleteRequest("test3", "1");
    DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
    System.out.println(response.status());
}

批量导入数据

代码语言:javascript
复制
/**
 * 批量导入数据
 */
@Test
void testBulkRequest() throws IOException {
    BulkRequest bulkRequest = new BulkRequest();
    bulkRequest.timeout("10s");
    ArrayList<User> users = new ArrayList<>();
    users.add(new User("WSuo1", 18));
    users.add(new User("WSuo2", 19));
    users.add(new User("WSuo3", 10));
    users.add(new User("WSuo4", 20));
    users.add(new User("WSuo5", 21));
    // 批处理请求
    for (User user : users) {
        bulkRequest.add(new IndexRequest("test3")
                .source(JSON.toJSONString(user), XContentType.JSON));
    }
    BulkResponse response = restHighLevelClient
            .bulk(bulkRequest, RequestOptions.DEFAULT);
    System.out.println(response.hasFailures());
}

可以看到 ID 值是随机给的,我们也可以指定 ID 值,在这个位置。

查询

查询出来所有的数据,这里提供的方法和类几乎和原生的 API 一致,如果你对于操作原生的数据库不熟悉,参考:https://blog.csdn.net/weixin_43941364/article/details/106272237

代码语言:javascript
复制
/**
 * 查询数据
 */
@Test
void testSearch() throws IOException {
    SearchRequest searchRequest = new SearchRequest("test3");
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    // 查询条件,我们可以使用 QueryBuilders 工具类实现
    // QueryBuilders.termQuery:     精确匹配
    // QueryBuilders.matchAllQuery: 匹配所有
    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "WSuo1");
    sourceBuilder.query(termQueryBuilder);
    // 分页
    sourceBuilder.from(0);
    sourceBuilder.size(2);
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    searchRequest.source(sourceBuilder);
    SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    SearchHits hits = response.getHits();
    System.out.println(JSON.toJSONString(hits));
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、ElasticSearch 集成 SpringBoot
  • 二、关于索引的 API 测试
  • 三、关于文档的 API 测试
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档