目录
- Elasticsearch rest-high-level-client 基本操作
- 前置准备
- 1.配置依赖
- 2.构建 RestHighLevelClient
- 3.创建索引 client.indices().create
- 4.删除索引 client.indices().delete
- 5.查询索引 client.indices().get
- 6.插入文档 client.index
- 7.查询文档 client.get
- 8.删除文档 client.delete
- 总结
Elasticsearch rest-high-level-client 基本操作
本篇主要讲解一下 rest-high-level-client 去操作 Elasticsearch , 虽然这个客户端在后续版本中会慢慢淘汰,但是目前大部分公司中使用Elasticsearch 版本都是6.x 所以这个客户端还是有一定的了解
前置准备
- 准备一个SpringBoot环境 2.2.11 版本
- 准备一个Elasticsearch 环境 我这里是8.x版本
- 引入依赖 elasticsearch-rest-high-level-client 7.4.2
1.配置依赖
注意: 我使用的是 springboot 2.2.11 版本 , 它内部的 elasticsearch 和 elasticsearch-rest-client 都是 6.8.13 需要注意
<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> | |
<!-- 引入 elasticsearch 7.4.2 --> | |
<dependency> | |
<groupId>org.elasticsearch</groupId> | |
<artifactId>elasticsearch</artifactId> | |
<version>7.4.2</version> | |
<exclusions> | |
<exclusion> | |
<artifactId>log4j-api</artifactId> | |
<groupId>org.apache.logging.log4j</groupId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<!-- 排除 elasticsearch-rest-client , 也可不排除 为了把maven冲突解决 --> | |
<dependency> | |
<groupId>org.elasticsearch.client</groupId> | |
<artifactId>elasticsearch-rest-high-level-client</artifactId> | |
<version>7.4.2</version> | |
<exclusions> | |
<exclusion> | |
<groupId>org.elasticsearch.client</groupId> | |
<artifactId>elasticsearch-rest-client</artifactId> | |
</exclusion> | |
<exclusion> | |
<artifactId>elasticsearch</artifactId> | |
<groupId>org.elasticsearch</groupId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<!-- 不引入会导致可能 使用 springboot的 elasticsearch-rest-client 6.8.13 --> | |
<dependency> | |
<groupId>org.elasticsearch.client</groupId> | |
<artifactId>elasticsearch-rest-client</artifactId> | |
<version>7.4.2</version> | |
</dependency> | |
<!-- elasticsearch 依赖 2.x 的 log4j --> | |
<dependency> | |
<groupId>org.apache.logging.log4j</groupId> | |
<artifactId>log4j-core</artifactId> | |
<version>2.8.2</version> | |
<!-- 排除掉 log4j-api 因为springbootstarter 中引入了loging模块 --> | |
<exclusions> | |
<exclusion> | |
<artifactId>log4j-api</artifactId> | |
<groupId>org.apache.logging.log4j</groupId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<!-- junit 单元测试 --> | |
<dependency> | |
<groupId>junit</groupId> | |
<artifactId>junit</artifactId> | |
<version>4.12</version> | |
</dependency> |
2.构建 RestHighLevelClient
highlevelclient 是 高级客户端 需要通过它去操作 Elasticsearch , 它底层也是要依赖 rest-client 低级客户端
public class TestEsClient { | |
private RestHighLevelClient client = null; | |
private ObjectMapper objectMapper = new ObjectMapper(); | |
//构建 RestHighLevelClient | |
public void prepare() { | |
// 创建Client连接对象 | |
String[] ips = {"172.16.225.111:9200"}; | |
HttpHost[] httpHosts = new HttpHost[ips.length]; | |
for (int i = 0; i < ips.length; i++) { | |
httpHosts[i] = HttpHost.create(ips[i]); | |
} | |
RestClientBuilder builder = RestClient.builder(httpHosts); | |
client = new RestHighLevelClient(builder); | |
} | |
} |
3.创建索引 client.indices().create
创建索引 需要使用 CreateIndexRequest 对象 , 操作 索引基本上是 client.indices().xxx
构建 CreateIndexRequest 对象
public void test1() { | |
CreateIndexRequest request = new CreateIndexRequest("blog1"); | |
try { | |
CreateIndexResponse createIndexResponse = | |
client.indices().create(request, RequestOptions.DEFAULT); | |
boolean acknowledged = createIndexResponse.isAcknowledged(); | |
log.info("[create index blog :{}]", acknowledged); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} |
4.删除索引 client.indices().delete
构建 DeleteIndexRequest 对象
public void testDeleteIndex(){ | |
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("blog1"); | |
try { | |
AcknowledgedResponse response = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT); | |
log.info("[delete index response: {}", response.isAcknowledged()); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} |
5.查询索引 client.indices().get
构建 GetIndexRequest 对象
public void testSearchIndex() { | |
GetIndexRequest request = new GetIndexRequest("blog1"); | |
try { | |
GetIndexResponse getIndexResponse = | |
client.indices().get(request, RequestOptions.DEFAULT); | |
Map<String, List<AliasMetaData>> aliases = getIndexResponse.getAliases(); | |
Map<String, MappingMetaData> mappings = getIndexResponse.getMappings(); | |
Map<String, Settings> settings = getIndexResponse.getSettings(); | |
log.info("[aliases: {}]", aliases); | |
log.info("[mappings: {}]", mappings); | |
log.info("[settings: {}", settings); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} |
可以根据 response 获取 aliases , mappings , settings 等等 和 Kibana 中返回的一样
6.插入文档 client.index
插入文档 需要使用 IndexRequest 对象 , 注意 不是 InsertRequest , 不知道为什么不这样定义 感觉会更加好理解
request.source(blogInfoJsonStr, XContentType.JSON);
public void insertDoc() { | |
IndexRequest request = new IndexRequest(); | |
request.index("blog1").id("1"); | |
BlogInfo blogInfo = | |
new BlogInfo() | |
.setBlogName("Elasticsearch 入门第一章") | |
.setBlogType("Elasticsearch") | |
.setBlogDesc("本篇主要介绍了Elasticsearch 的基本client操作"); | |
try { | |
//提供java 对象的 json str | |
String blogInfoJsonStr = objectMapper.writeValueAsString(blogInfo); | |
request.source(blogInfoJsonStr, XContentType.JSON); | |
// 这里会抛错 原因是 我的 Elasticsearch 版本8.x 而 使用的 restHighLevel 已经解析不了,因为新的es已经不推荐使用 | |
// restHighLevel,而使用 Elasticsearch Java API Client | |
IndexResponse index = client.index(request, RequestOptions.DEFAULT); | |
log.info("[Result insert doc :{} ]", index); | |
} catch (IOException e) { | |
} |
7.查询文档 client.get
注意 getResponse.getSourceAsString() 返回文档数据
public void testSelectDoc() { | |
GetRequest getRequest = new GetRequest(); | |
getRequest.index("blog1").id("1"); | |
try { | |
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT); | |
BlogInfo blogInfo = | |
objectMapper.readValue(getResponse.getSourceAsString(), BlogInfo.class); | |
log.info("[get doc :{}] ", blogInfo); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} |
8.删除文档 client.delete
注意 删除文档 的 response 也解析不了 Elasticsearch 8.x 版本
public void testDeleteDoc() { | |
DeleteRequest deleteRequest = new DeleteRequest(); | |
deleteRequest.index("blog1").id("1"); | |
try { | |
// 这里也会抛错 和上面的一样 | |
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT); | |
log.info("[delete response:{} ]", deleteResponse); | |
} catch (IOException e) { | |
} | |
} |
总结
本篇主要介绍了 java 操作Elasticsearch 的客户端 rest-high-level-client 的基本使用 , 如果你是使用springboot 需要注意jar 冲突问题, 后续操作 Elasticsearch 客户端 逐渐变成 Elasticsearch Java API Client , 不过目前大部分还是使用 rest-high-level-client