本章讲解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高级客户端的依赖:
org.elasticsearch.client
elasticsearch-rest-high-level-client
7.4.0
本次完整的pom文件如下,Y因为是我以前的项目,有些配置可能用不到,请大家自行考究。
4.0.0
cn.edu.ccut
java-elasticsearch
0.0.1-SNAPSHOT
war
1.8
5.1.9.RELEASE
5.4.4.Final
7.4.0
org.elasticsearch.client
elasticsearch-rest-high-level-client
${es.version}
org.springframework
spring-webmvc
${spring.version}
org.hibernate
hibernate-core
${hibernate.version}
org.hibernate
hibernate-entitymanager
${hibernate.version}
org.springframework
spring-orm
${spring.version}
com.alibaba
druid
1.1.20
mysql
mysql-connector-java
5.1.47
org.springframework
spring-test
${spring.version}
test
junit
junit
4.12
test
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 jsonMap = new HashMap<>();
jsonMap.put("id", "1005");
jsonMap.put("name", "陈立志");
jsonMap.put("age", 23);
jsonMap.put("email", "[email protected]");
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 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 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 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 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 highlightFields = hit.getHighlightFields();
String sourceAsString = hit.getSourceAsString();
Map sourceAsMap = hit.getSourceAsMap();
System.out.println("sourceAsString->"+sourceAsString);
System.out.println("sourceAsMap->"+sourceAsMap);
System.out.println("highlightFields->"+highlightFields);
}
}
查询的结果如下所示: