ElasticSearch进阶(一)ElasticSearch的Java客户端

前言

      本章讲解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);
	}
}

查询的结果如下所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值