前言
本章讲解ElasticSearch的Java客户端的使用
方法
1.概念
在ES中,提供了多种语言客户端的操控!那么Java我们推荐使用Java REST Client
后期与spring或者springboot整合的时候我们将会使用更加牛x的API哦!
而Java REST Client又分为两种,我们重点讲解Java High Level REST Client(Java高级的REST客户端)
本次将通过翻阅文档的方式来带大家熟悉这款API.
2.Java High Level REST Client的环境搭建
首先我们确定ES中有一些测试数据,如:
Java高级REST客户端的API地址:https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-high-level-client/7.4.0/index.html.
1)创建maven项目
我直接拿我之前的maven项目做了一个copy,大家可以选择自行创建。
2)修改pom文件
最主要的添加如下的配置引入ES高级客户端的依赖:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.0</version>
</dependency>
本次完整的pom文件如下,Y因为是我以前的项目,有些配置可能用不到,请大家自行考究。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.edu.ccut</groupId>
<artifactId>java-elasticsearch</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<!-- 设定Java的版本 -->
<java.version>1.8</java.version>
<!-- 设定Spring的版本 -->
<spring.version>5.1.9.RELEASE</spring.version>
<!-- 设定Hibernate的版本 -->
<hibernate.version>5.4.4.Final</hibernate.version>
<!-- 设定ElasticSearch的版本 -->
<es.version>7.4.0</es.version>
</properties>
<dependencies>
<!-- Java High Level Client for ElasticSearch -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${es.version}</version>
</dependency>
<!-- 引入Spring相关jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 引入Hibernate相关jar -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- 引入Hibernate JPA的相关jar -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- 引入Hibernate整合Spring相关jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 引入Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
<!-- mysql jdbc -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 引入spring整合JUnit测试包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!-- 引入JUnit测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.常用的操作
首先编写测试文件:
package cn.edu.ccut.test;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.HttpHost;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class PersonTest {
private RestHighLevelClient client;
@Before
public void init(){
this.client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")));
}
@After
public void finish() throws Exception{
this.client.close();
}
}
1)添加文档
编写添加文档的方法如下:
@Test
public void testCreateDoc() throws Exception{
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("id", "1005");
jsonMap.put("name", "陈立志");
jsonMap.put("age", 23);
jsonMap.put("email", "2345631234@qq.com");
jsonMap.put("hobby", "跳舞、踢足球、下围棋");
IndexRequest indexRequest = new IndexRequest("jwang01")
.id("1005").source(jsonMap);
IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println("id->"+indexResponse.getId());
System.out.println("index->"+indexResponse.getIndex());
System.out.println("version->"+indexResponse.getVersion());
}
执行后观察数据结果如下:
2)根据id查询文档
@Test
public void testSearchDoc01() throws Exception{
GetRequest getRequest = new GetRequest("jwang01", "1001");
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
if (getResponse.isExists()) {
long version = getResponse.getVersion();
String sourceAsString = getResponse.getSourceAsString();
Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
byte[] sourceAsBytes = getResponse.getSourceAsBytes();
System.out.println("version->"+version);
System.out.println("sourceAsString->"+sourceAsString);
System.out.println("sourceAsMap->"+sourceAsMap);
System.out.println("sourceAsBytes->"+sourceAsBytes);
}
}
执行结果如下所示:
3)根据id删除文档
@Test
public void testDeleteDoc() throws Exception{
DeleteRequest request = new DeleteRequest("jwang01","1005");
DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);
System.out.println("id->"+deleteResponse.getId());
System.out.println("index->"+deleteResponse.getIndex());
System.out.println("version->"+deleteResponse.getVersion());
}
执行完毕后观察数据:
4)根据id更新文档
@Test
public void testUpdateDoc() throws Exception{
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("name", "张三三");
UpdateRequest request = new UpdateRequest("jwang01", "1001").doc(jsonMap);
UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
System.out.println("id->"+updateResponse.getId());
System.out.println("index->"+updateResponse.getIndex());
System.out.println("version->"+updateResponse.getVersion());
}
执行后观察数据:
5)查询指定index的所有数据
@Test
public void testSearchDoc02() throws Exception{
SearchRequest searchRequest = new SearchRequest("jwang01");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
String sourceAsString = hit.getSourceAsString();
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
System.out.println("sourceAsString->"+sourceAsString);
System.out.println("sourceAsMap->"+sourceAsMap);
}
}
查询的结果如下:
6)查询爱好中包含篮球的数据
@Test
public void testSearchDoc03() throws Exception{
SearchRequest searchRequest = new SearchRequest("jwang01");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("hobby", "篮球"));
searchSourceBuilder.from(0);
searchSourceBuilder.size(5);
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
String sourceAsString = hit.getSourceAsString();
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
System.out.println("sourceAsString->"+sourceAsString);
System.out.println("sourceAsMap->"+sourceAsMap);
}
}
查询结果如下所示:
7)查询爱好中包含篮球的数据,并高亮显示
@Test
public void testSearchDoc04() throws Exception{
SearchRequest searchRequest = new SearchRequest("jwang01");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("hobby", "篮球"));
searchSourceBuilder.from(0);
searchSourceBuilder.size(5);
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
HighlightBuilder highlightBuilder = new HighlightBuilder();
HighlightBuilder.Field highlightHobby =new HighlightBuilder.Field("hobby");
highlightHobby.highlighterType("unified");
highlightBuilder.field(highlightHobby);
searchSourceBuilder.highlighter(highlightBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
String sourceAsString = hit.getSourceAsString();
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
System.out.println("sourceAsString->"+sourceAsString);
System.out.println("sourceAsMap->"+sourceAsMap);
System.out.println("highlightFields->"+highlightFields);
}
}
查询的结果如下所示: