ElasticSearch(2):Java 链接 Elastic
2019-12-16 本文已影响0人
小炉炉
ElasticSearch(2):Java 链接 ElasticSearch 客户端入门
1.入门简介
使用Java 链接并且操作 ES 有两种方式 1.SpringDataElasticSearch 2.使用 ES 原生的链接方式。使用第一种方式
的话,需要注意ES版本号与Spring Data ElasticSearch 版本的号需要对应才行。因为ES的版本更新快且每一个大的版本
更新都会有一些API发生变化。所以,如果使用SpringDataElasticSearch的方式的话,需要注意版本的对应关系。
对应关系如下:
Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Boot |
---|---|---|---|
Moore | 3.2.x | 6.8.4 | 2.2.x |
Lovelace | 3.1.x | 6.2.2 | 2.1.x |
Kay | 3.0.x | 5.5.0 | 2.0.x |
Ingalls | 2.1.x | 2.4.0 | 1.5.x |
各个版本号必须一致才行否则的话,就会出现各种问题。我这里使用的是第二种方法来链接ES客户端,通过
RestHighLevelClient 客户端来进行操作。
2.链接客户端
需要引入maven依赖:由于我这里电脑本机上安装的是7.4.0版本的,所以我这里引入了三个ES相关的依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.4.0</version>
</dependency>
我创建了一个新的SpringBoot项目,所以我这里直接把链接ES的过程封装成了一个SpringBean的方式。
让SpringBoot项目启动之后自动链接ES。
1.新建SpringBoot项目。pom.xml结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.snowy</groupId>
<artifactId>testes</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>testes</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--elastic 的 三个依赖 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.创建elasticsearch.properties 文件
pzkj.elasticsearch.host=localhost
pzkj.elasticsearch.port=9200
pzkj.elasticsearch.scheme=http
主要是配置ES的链接地址以机端口等信息。
3.创建ElasticSearchConfig 文件并将其注入到SpringBean容器中。
@Configuration
@PropertySource(value = "classpath:config/elasticsearch.properties")
public class ElasticSearchConfig {
private Logger logger = LogManager.getLogger(ElasticSearchConfig.class);
@Value(value = "${pzkj.elasticsearch.host}")
String host;
@Value(value = "${pzkj.elasticsearch.port}")
String port;
@Value(value = "${pzkj.elasticsearch.scheme}")
String scheme;
/**
* ClientConfiguration 该对象可以更改客户端行为,哦诶之ssl,连接,以及套接字超时选项等
* @return
*/
@Bean
public RestHighLevelClient restHighLevelClient(){
HttpHost httpHost = new HttpHost(host, Integer.parseInt(port), scheme);
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(httpHost));
logger.info("成功注册到Spring容器中。");
return restHighLevelClient;
}
}
此时,运行SringBoot项目,就自动将链接ES的过程注入到了SpringBean容器中了。
3.一个简单的测试例子来写入和查询数据:
@SpringBootTest
class TestesApplicationTests {
@Autowired
RestHighLevelClient restHighLevelClient;
/* 写入数据 */
@Test
void contextLoads() {
HttpHost httpHost = new HttpHost("localhost", 9200, "http");
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(httpHost));
Map<String, Object> jsonMap = new HashMap<>();
/*jsonMap.put("user", "何必平");
jsonMap.put("postDate", new Date());
jsonMap.put("message", "永安当掌柜的跟班,极具商业才华,在大战中名为反叛实则卧底,最后被邪剑仙杀死。");*/
jsonMap.put("user", "何必平");
jsonMap.put("postDate", new Date());
jsonMap.put("message", "永安当掌柜的跟班,景天死忠");
IndexRequest indexRequest = new IndexRequest("posts").source(jsonMap);
try {
IndexResponse index = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.printf(index.toString());
restHighLevelClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/* 获取数据 */
@Test
public void getRequest(){
GetRequest posts = new GetRequest("posts", "1");
try {
GetResponse documentFields = restHighLevelClient.get(posts, RequestOptions.DEFAULT);
restHighLevelClient.close();
Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
sourceAsMap.forEach((key, value) -> {
System.out.println("=========================");
System.out.println(key);
System.out.println(value);
});
} catch (IOException e) {
e.printStackTrace();
}
}
}