ElasticSearch(2):Java 鏈接 ElasticSearch 客戶端入門
1.入門簡介
使用Java 鏈接并且操作 ES 有兩種方式 1.SpringDataElasticSearch 2.使用 ES 原生的鏈接方式揍瑟。使用第一種方式
的話,需要注意ES版本號與Spring Data ElasticSearch 版本的號需要對應(yīng)才行。因為ES的版本更新快且每一個大的版本
更新都會有一些API發(fā)生變化。所以,如果使用SpringDataElasticSearch的方式的話差购,需要注意版本的對應(yīng)關(guān)系。
對應(yīng)關(guān)系如下:
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 |
各個版本號必須一致才行否則的話,就會出現(xiàn)各種問題那槽。我這里使用的是第二種方法來鏈接ES客戶端,通過
RestHighLevelClient 客戶端來進行操作等舔。
2.鏈接客戶端
需要引入maven依賴:由于我這里電腦本機上安裝的是7.4.0版本的骚灸,所以我這里引入了三個ES相關(guān)的依賴
<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>
我創(chuàng)建了一個新的SpringBoot項目,所以我這里直接把鏈接ES的過程封裝成了一個SpringBean的方式慌植。
讓SpringBoot項目啟動之后自動鏈接ES甚牲。
1.新建SpringBoot項目。pom.xml結(jié)構(gòu)如下:
<?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.創(chuàng)建elasticsearch.properties 文件
pzkj.elasticsearch.host=localhost
pzkj.elasticsearch.port=9200
pzkj.elasticsearch.scheme=http
主要是配置ES的鏈接地址以機端口等信息蝶柿。
3.創(chuàng)建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.一個簡單的測試?yán)觼韺懭牒筒樵償?shù)據(jù):
@SpringBootTest
class TestesApplicationTests {
@Autowired
RestHighLevelClient restHighLevelClient;
/* 寫入數(shù)據(jù) */
@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", "永安當(dāng)掌柜的跟班纵顾,極具商業(yè)才華伍茄,在大戰(zhàn)中名為反叛實則臥底,最后被邪劍仙殺死施逾。");*/
jsonMap.put("user", "何必平");
jsonMap.put("postDate", new Date());
jsonMap.put("message", "永安當(dāng)掌柜的跟班敷矫,景天死忠");
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();
}
}
/* 獲取數(shù)據(jù) */
@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();
}
}
}