带你读《Elastic Stack 实战手册》之67:——3.5.19.3.Elasticsearch语言开发(Java)(下)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《Elastic Stack 实战手册》之67:——3.5.19.3.Elasticsearch语言开发(Java)(下)


《Elastic Stack 实战手册》——三、产品能力——3.5 进阶篇——3.5.19.Elasticsearch语言开发(Python/Nodejs/Java)——3.5.19.3.Elasticsearch语言开发(Java)(上) https://developer.aliyun.com/article/1226559



三、常见 API 使用

 

以下将围绕一个名为 posts 的索引进行常用 API 介绍。

 

1. Index API

 

向 posts 索引中写入一条数据。


public static void index() throws IOException {
    //构建 IndexRequest 并设置索引名称
    IndexRequest request = new IndexRequest("posts");
    //文档 id (可选,若不指定,ES 会主动生成)
    request.id("1");
//设置文档内容 此处选择以 JSON 字符串的形式构建文档内容,
  //其还支持 XContentBuilder、Map、Object key-pairs 的形式
    String jsonString = "{" +
            "\"user\":\"kimchy\"," +
            "\"postDate\":\"2021-11-09\"," +
            "\"message\":\"trying out Elasticsearch\"" +
            "}";
    request.source(jsonString, XContentType.JSON);
    IndexResponse indexResponse =
            client.index(request, RequestOptions.DEFAULT);
    System.out.println(indexResponse);
}

结果输出:

IndexResponse[index=posts,type=_doc,id=1,version=1,result=updated
,seqNo=2,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]

2. Update API

 

将索引 posts 中 id 为1的文档 message 值更新为 "trying out update"。


public static void update() throws IOException {
    //构建 UpdateRequest 设置索引名称和文档 id
     UpdateRequest request = new UpdateRequest("posts", "1");
    //设置更新内容 构建形式可类比 Index API
    String jsonString = "{" +
            "\"message\":\"trying out Update\"" +
            "}";
    request.doc(jsonString, XContentType.JSON);
    //upsert 方法可以实现文档存在则更新,不存在则新增的效果。
    //request.upsert(jsonString, XContentType.JSON);
UpdateResponse updateResponse =     client.update(request, RequestOptions.DEFAULT);
    System.out.println(updateResponse);
}

 结果输出:

 

UpdateResponse[index=posts,type=_doc,id=1,version=2,seqNo=3
,primaryTerm=1,result=updated
,shards=ShardInfo{total=2, successful=1, failures=[]}]


3. Update By Query API

 

将索引 posts 中所有 user=kimchy 的文档 message 值更新为 "trying out UpdateByQuery"。此 API 需要用到 script 方式进行更新。


public static void updateByQuery() throws IOException {
    //构建 UpdateByQueryRequest 并设置索引名称
    UpdateByQueryRequest request = new UpdateByQueryRequest("posts");
    //版本冲突时继续执行
    request.setConflicts("proceed");
    //查询条件
    request.setQuery(new TermQueryBuilder("user", "kimchy"));
    //设置更新脚本
    Map<String, Object> params = new HashMap<>();
    params.put("message", "trying out UpdateByQuery");
    Script script = new Script(ScriptType.INLINE,
            "painless",
            "ctx._source.message = params.message", params);
    request.setScript(script);
    BulkByScrollResponse bulkResponse =
            client.updateByQuery(request, RequestOptions.DEFAULT);
    System.out.println(bulkResponse);
}

结果输出:

BulkByScrollResponse[took=394ms,timed_out=false,sliceId=null,updated=1
,created=0,deleted=0,batches=1,versionConflicts=0,noops=0,retries=0
,throttledUntil=0s,bulk_failures=[],search_failures=[]]

4. Bulk API

 

对 posts 索引批量执行写入、更新、删除的操作。


public static void bulk() throws IOException {
    //构建 BulkRequest 
    // 可添加多个DeleteRequest、UpdateRequest、IndexRequest
    BulkRequest request = new BulkRequest();
    String jsonString = "{" +
            "\"user\":\"radish\"," +
            "\"postDate\":\"2021-11-09\"," +
            "\"message\":\"trying out bulk\"" +
            "}";
    request.add(new IndexRequest("posts").id("2")
            .source(jsonString, XContentType.JSON));
//        request.add(new DeleteRequest("posts", "1"));
    request.add(new UpdateRequest("posts", "1")
            .doc(XContentType.JSON, "message", "trying out bulk"));
    BulkResponse bulkResponse = 
            client.bulk(request, RequestOptions.DEFAULT);
    System.out.println("bulk result:" + bulkResponse.hasFailures());
}

结果输出:

bulk hasFailures:false

5. Get API

 

获取 posts 索引中 id 为1的文档。


public static void get() throws IOException {
    //构建 GetRequest 并设置索引名称和文档 id
    GetRequest getRequest = new GetRequest("posts", "1");
    GetResponse getResponse 
    = client.get(getRequest, RequestOptions.DEFAULT);
    Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
    System.out.println(sourceAsMap);

结果输出:

 

{postDate=2021-11-09, message=trying out Elasticsearch, user=kimchy}

6. Search API

 

对 posts 进行所有文档搜索。


public static void search() throws IOException {
    //构建 SearchRequest 并设置索引名称
    SearchRequest searchRequest = new SearchRequest("posts");
    //设置搜索条件
    SearchSourceBuilder searchSourceBuilder 
    = new SearchSourceBuilder();
  //此处设置查询条件,应根据实际需求设置
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
public static void search() throws IOException {
    //构建 SearchRequest 并设置索引名称
    SearchRequest searchRequest = new SearchRequest("posts");
    //设置搜索条件
    SearchSourceBuilder searchSourceBuilder 
    = new SearchSourceBuilder();
  //此处设置查询条件,应根据实际需求设置
searchSourceBuilder.query(QueryBuilders.matchAllQuery());

结果输出:


{postDate=2021-11-09, message=trying out bulk, user=kimchy}
{postDate=2021-11-09, message=trying out bulk, user=radish}

7. Delete API

 

删除 posts 索引 id 为1的文档。


public static void delete() throws IOException {
    //构建 DeleteRequest 并设置索引名称和文档 ID
    DeleteRequest request = new DeleteRequest("posts", "1");
    DeleteResponse deleteResponse 
    = client.delete(request, RequestOptions.DEFAULT);
     System.out.println(deleteResponse);
}

 结果输出:

DeleteResponse[index=posts,type=_doc,id=1,version=15,result=deleted,
shards=ShardInfo{total=2, successful=1, failures=[]}]

8、DeleteByQuery API

 

删除索引 posts 中所有 user=radish 的文档。


public static void deleteByQuery() throws IOException {
    //构建 DeleteByQueryRequest 并指定索引名称
    DeleteByQueryRequest request = new DeleteByQueryRequest("posts");
    request.setQuery(new TermQueryBuilder("user", "radish"));
    BulkByScrollResponse bulkResponse 
    = client.deleteByQuery(request, RequestOptions.DEFAULT);
    System.out.println(bulkResponse);
}

结果输出:

BulkByScrollResponse[took=13ms,timed_out=false,sliceId=null,updated=0
,created=0,deleted=0,batches=0,versionConflicts=0,noops=0,retries=0
,throttledUntil=0s,bulk_failures=[],search_failures=[]]

四、完整示例

 

本节所涉及的代码示例均在此 github 仓库中:

https://github.com/lixueyu001/elasticsearch-java

 

参考

 

l https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.10/java-rest-high.html

 

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
3天前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
17 4
|
3天前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
18 2
|
1月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
100 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
2天前
|
Java 关系型数据库 API
介绍一款Java开发的企业接口管理系统和开放平台
YesApi接口管理平台Java版,基于Spring Boot、Vue.js等技术,提供API接口的快速研发、管理、开放及收费等功能,支持多数据库、Docker部署,适用于企业级PaaS和SaaS平台的二次开发与搭建。
|
2天前
|
监控 Java 测试技术
Java开发现在比较缺少什么工具?
【10月更文挑战第15天】Java开发现在比较缺少什么工具?
13 1
|
4天前
|
Java
Java开发如何实现文件的移动,但是在移动结束后才进行读取?
【10月更文挑战第13天】Java开发如何实现文件的移动,但是在移动结束后才进行读取?
15 2
|
8天前
|
运维 Java Linux
【运维基础知识】掌握VI编辑器:提升你的Java开发效率
本文详细介绍了VI编辑器的常用命令,包括模式切换、文本编辑、搜索替换及退出操作,帮助Java开发者提高在Linux环境下的编码效率。掌握这些命令,将使你在开发过程中更加得心应手。
11 2
|
1月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
129 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
1月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
90 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
1月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
42 3
基于Java+Springboot+Vue开发的美容预约管理系统

相关产品

  • 检索分析服务 Elasticsearch版