創(chuàng)建springboot整合es項(xiàng)目
一定要修改對(duì)應(yīng)es版本
修改es版本,我的pom文件:
<?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.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springboot-es</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-es</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.6.1</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

記得把沒用文件刪掉.mvn,和一些mvn的配置文件,要不然可能會(huì)導(dǎo)致項(xiàng)目編譯不通過
配置HighLevelClient
注: 在ElasticSearch 7以后,Spring data建議采用High-level REST client。
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchConfig {
// 注冊(cè) rest高級(jí)客戶端
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1",9200,"http")
)
);
return client;
}
}
索引增刪改查操作
在測(cè)試類進(jìn)行測(cè)試,測(cè)試類中直接注入restHighLevelClient即可使用;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4進(jìn)行測(cè)試
public class SpringbootEsApplicationTests {
@Autowired
public RestHighLevelClient restHighLevelClient;
// 創(chuàng)建索引
@Test
public void createIndex() throws IOException {
org.elasticsearch.client.indices.CreateIndexRequest yida = new org.elasticsearch.client.indices.CreateIndexRequest("yida");
org.elasticsearch.client.indices.CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(yida, RequestOptions.DEFAULT);
System.out.println(JSONObject.toJSONString(createIndexResponse));
restHighLevelClient.close();
}
// 測(cè)試獲取索引,并判斷其是否存在
@Test
public void testIndexIsExists() throws IOException {
GetIndexRequest request = new GetIndexRequest("yida");
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);// 索引是否存在
restHighLevelClient.close();
}
// 刪除索引
@Test
public void testDeleteIndex() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("yida");
AcknowledgedResponse response = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(response.isAcknowledged());// 是否刪除成功
restHighLevelClient.close();
}
}
文檔的基本操作
文檔的增刪改查;
// 測(cè)試添加文檔(先創(chuàng)建一個(gè)User實(shí)體類,添加fastjson依賴)
@Test
public void testAddDocument() throws IOException {
// 創(chuàng)建一個(gè)User對(duì)象
User yida = new User("yida", 18);
// 創(chuàng)建請(qǐng)求
IndexRequest request = new IndexRequest("yida");
// 制定規(guī)則 PUT /yida_index/_doc/1
request.id("1");// 設(shè)置文檔ID
request.timeout(TimeValue.timeValueMillis(1000));// request.timeout("1s")
// 將我們的數(shù)據(jù)放入請(qǐng)求中
request.source(JSON.toJSONString(yida), XContentType.JSON);
// 客戶端發(fā)送請(qǐng)求,獲取響應(yīng)的結(jié)果
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println(response.status());// 獲取建立索引的狀態(tài)信息 CREATED
System.out.println(response);// 查看返回內(nèi)容 IndexResponse[index=yida_index,type=_doc,id=1,version=1,result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]
}
// 獲取文檔,判斷是否存在 get /yida/_doc/1
@Test
public void testDocumentIsExists() throws IOException {
GetRequest request = new GetRequest("yida", "1");
// 不獲取返回的 _source的上下文了
request.fetchSourceContext(new FetchSourceContext(false));
request.storedFields("_none_");
boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
restHighLevelClient.close();
}
// 測(cè)試更新文檔內(nèi)容
@Test
public void testUpdateDocument() throws IOException {
UpdateRequest request = new UpdateRequest("yida", "1");
User user = new User("doudou",11);
request.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
System.out.println(response.status()); // OK
restHighLevelClient.close();
}
// 測(cè)試刪除文檔
@Test
public void testDeleteDocument() throws IOException {
DeleteRequest request = new DeleteRequest("yida", "1");
request.timeout("1s");
DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
System.out.println(response.status());// OK
}
// 測(cè)試獲得文檔信息
@Test
public void testGetDocument() throws IOException {
GetRequest request = new GetRequest("yida","1");
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());// 打印文檔內(nèi)容
System.out.println(request);// 返回的全部?jī)?nèi)容和命令是一樣的
restHighLevelClient.close();
}
文檔的復(fù)雜查詢
// 查詢
// SearchRequest 搜索請(qǐng)求
// SearchSourceBuilder 條件構(gòu)造
// HighlightBuilder 高亮
// TermQueryBuilder 精確查詢
// MatchAllQueryBuilder
// xxxQueryBuilder ...
@Test
public void testSearch() throws IOException {
// 1.創(chuàng)建查詢請(qǐng)求對(duì)象
SearchRequest searchRequest = new SearchRequest("yida");
// 2.構(gòu)建搜索條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// (1)查詢條件 使用QueryBuilders工具類創(chuàng)建
// 精確查詢
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "張");
// // 匹配查詢
// MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
// (2)其他<可有可無>:(可以參考 SearchSourceBuilder 的字段部分)
// 設(shè)置高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder = highlightBuilder.requireFieldMatch(false).field("*").preTags("<font color='red'>").postTags("</font>");
searchSourceBuilder.highlighter(highlightBuilder);
// // 分頁
// searchSourceBuilder.from();
// searchSourceBuilder.size();
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
// (3)條件投入
searchSourceBuilder.query(termQueryBuilder);
// 3.添加條件到請(qǐng)求
searchRequest.source(searchSourceBuilder);
// 4.客戶端查詢請(qǐng)求
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 5.查看返回結(jié)果
SearchHits hits = search.getHits();
System.out.println(JSON.toJSONString(hits));
System.out.println("=======================");
for (SearchHit documentFields : hits.getHits()) {
System.out.println(documentFields.getSourceAsMap());
// 使用新的字段值(高亮),覆蓋舊的字段值
Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
// 高亮字段
Map<String, HighlightField> highlightFields = documentFields.getHighlightFields();
HighlightField name = highlightFields.get("name");
// 替換
if (name != null){
Text[] fragments = name.fragments();
StringBuilder new_name = new StringBuilder();
for (Text text : fragments) {
new_name.append(text);
}
sourceAsMap.put("name",new_name.toString());
}
System.out.println("替換高亮的字段"+JSONObject.toJSON(sourceAsMap));
}
}
文檔的批量操作
bulk語法
bulk對(duì)JSON串的有著嚴(yán)格的要求。每個(gè)JSON串不能換行,只能放在同一行,同時(shí),相鄰的JSON串之間必須要有換行。bulk的每個(gè)操作必須要一對(duì)JSON串(delete語法除外)
例如若增加一個(gè)文檔如下所示:
## 批量操作
POST _bulk
{"create": {"_index": "yida", "_id": 11}}
{"name": "test_bulk", "age":"100"}
## 批量刪除
POST _bulk
{"delete": {"_index": "yida","_id": "1"}}
{"delete": {"_index": "yida","_id": "2"}}
{"delete": {"_index": "yida","_id": "3"}}
{"delete": {"_index": "yida","_id": "4"}}
## 可以又新增又刪除
POST _bulk
{"index": {"_index": "yida","_id": 11}}
{"name": "test_bulk", "age":"101"}
{"index": {"_index": "yida","_id": 12}}
{"name": "test_bulk", "age":"101"}
{"delete": {"_index": "yida","_id": "11"}}
{"delete": {"_index": "yida","_id": "12"}}
操作類型文章來源:http://www.zghlxwxcb.cn/news/detail-485368.html
- create 如果文檔不存在就創(chuàng)建,但如果文檔存在就返回錯(cuò)誤
- index 如果文檔不存在就創(chuàng)建,如果文檔存在就更新
- update 更新一個(gè)文檔,如果文檔不存在就返回錯(cuò)誤
- delete 刪除一個(gè)文檔,如果要?jiǎng)h除的文檔id不存在,就返回錯(cuò)誤
從以上可以看出index是比較常用的,因?yàn)閎ulk操作失敗不會(huì)影響其他文檔操作,我們可以從他的返回結(jié)果中查看失敗的詳細(xì)原因。
對(duì)應(yīng)的代碼操作也是跟命令一樣:文章來源地址http://www.zghlxwxcb.cn/news/detail-485368.html
// 批量插入數(shù)據(jù)
@Test
public void testBulkAdd() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> users = new ArrayList<>();
users.add(new User("張益達(dá)-1",1));
users.add(new User("張益達(dá)-2",2));
users.add(new User("張益達(dá)-3",3));
users.add(new User("張益達(dá)-4",4));
users.add(new User("張益達(dá)-5",5));
users.add(new User("張益達(dá)-6",6));
// 批量請(qǐng)求處理
for (int i = 0; i < users.size(); i++) {
bulkRequest.add(
// 這里是數(shù)據(jù)信息
new IndexRequest("yida")
.id(""+(i + 1)) // 沒有設(shè)置id 會(huì)自定生成一個(gè)隨機(jī)id
.source(JSON.toJSONString(users.get(i)),XContentType.JSON)
);
}
BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulk.status());// ok
}
@Test
public void testBulkUpdate() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> users = new ArrayList<>();
users.add(new User("張益達(dá)-1-update1",1));
users.add(new User("張益達(dá)-2-update1",2));
users.add(new User("張益達(dá)-3-update",3));
users.add(new User("張益達(dá)-4-update",4));
users.add(new User("張益達(dá)-5-update",5));
users.add(new User("張益達(dá)-6-update",6));
// 批量請(qǐng)求處理
for (int i = 0; i < users.size(); i++) {
Map map = JSON.parseObject(JSONObject.toJSONString(users.get(i)), Map.class);
bulkRequest.add(
new UpdateRequest("yida", "" + (i + 1))
.doc(map)
// 不存在就插入
.upsert(JSON.toJSONString(users.get(i)),XContentType.JSON)
);
}
BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulk.status());// ok
}
@Test
public void testBulkDelete() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> users = new ArrayList<>();
users.add(new User("張益達(dá)-1",1));
users.add(new User("張益達(dá)-2",2));
users.add(new User("張益達(dá)-3",3));
users.add(new User("張益達(dá)-4",4));
users.add(new User("張益達(dá)-5",5));
users.add(new User("張益達(dá)-6",6));
// 批量請(qǐng)求處理
for (int i = 0; i < users.size(); i++) {
bulkRequest.add(
// 這里是數(shù)據(jù)信息
new DeleteRequest("yida")
.id("" + (i + 1))
);
}
BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulk.status());// ok
}
到了這里,關(guān)于springboot操作es的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!