一、SpringBoot整合ElasticSearch

1.SpringBoot整合ElasticSearch
ElasticSearch SpringBoot Integration
匯入依賴
Maven庫
先看下官網給出的參考



以上加上SpringBoot整合ElasticSearch需要的maven依賴,通過官方檔案我們可以知道其實就是這兩個jar包在起作用

2.鏈接ES的客戶端
Link to ES client
如下圖:
通過RestHighLevelCilent 物件,指定鏈接ES地址
RestHighLevelCilent client = new RestHighLevelClient();
client.builder(new HttpHost("localhost",9200,"http"),
new HttpHost("localhost",9201,"http")
);

3.撰寫查詢運算式 Writing Query Expressions
下圖這段話的意思大概是,在用RestHighLevelClient鏈接后,我們可以通過RequestOpetions物件來創建ElasticSearch的運算式,

二、如何使用Java代碼操作各種復雜的ES查詢
1.我們大概需要學習如下的API We Probably Need To Learn The Following APIs

2.Index API
Index Request基本寫法
Index Request Basic Notation
字串寫法:
IndexRequest request = new IndexRequest("posts");
request.id("1");
String jsonString = "{" +
"\"user\":\"kimchy\"," +
"\"postDate\":\"2013-01-30\"," +
"\"message\":\"trying out Elasticsearch\"" +
"}";
request.source(jsonString, XContentType.JSON);
// 以上這種寫法毫無疑問很麻煩,所以一般使用另一種方法代替
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("user", "kimchy");
jsonMap.put("postDate", new Date());
jsonMap.put("message", "trying out Elasticsearch");
IndexRequest indexRequest = new IndexRequest("posts")
.id("1").source(jsonMap);
// 檔案源作為xcontentBuilder物件提供,Elasticsearch內置幫助程式生成JSON內容
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.field("user", "kimchy");
builder.timeField("postDate", new Date());
builder.field("message", "trying out Elasticsearch");
}
builder.endObject();
IndexRequest indexRequest = new IndexRequest("posts")
.id("1").source(builder);
//檔案源作為物件鍵對提供,它被轉換為JSON格式
IndexRequest indexRequest = new IndexRequest("posts")
.id("1")
.source("user", "kimchy",
"postDate", new Date(),
"message", "trying out Elasticsearch");
以上兩種方式,在沒有工具類的情況下,第二種比較簡易好用,阿里推出的JSON的工具也給我們帶來了很多的簡便,匯入如下依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
在使用的時候只需要
JSON.toJSONString(物件/集合);
3.如何選擇引數,引數的說明
How To Select Parameters, Parameter Description
request.routing("routing");
// 設定等待超時時間,可以有兩種方式
// 1.秒值設定
request.timeout(TimeValue.timeValueSeconds(1));
// 2.字串設定
request.timeout("1s");
4.還有很多關于引數的說明,下次我再額外的做一次說明吧,今天先說說怎么整合SpringBoot

三、idea實操SpringBoot集成ElasticSearch
Idea SpringBoot Integration With ElasticSearch
1、創建一個SpingBoot的專案
1、Create A SpingBoot Project




2、構建配置類,連接ES
2. Build Configuration Class And Connect ES
package com.esproject.demoapi.configES;
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;
/**
* author: wangjiulong
* date: 2021-01-17
* desc:關于elasticSearch的客戶端配置
*/
@Configuration
public class ElasticSearchConfig {
// 放到spring中待用
@Bean
public RestHighLevelClient getBean(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1",9200,"http"))
);
return client;
}
}

3.創建索引
3. Create an index
@Autowired
@Qualifier("getBean")
private RestHighLevelClient restHighLevelClient;
// 1.測驗索引的創建
@Test
void testCreateIndex() throws IOException {
// 1.創建索引
CreateIndexRequest createIndexRequest=new CreateIndexRequest("wangjiulong_index");
// 2.客戶端執行請求
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
// 3.列印索引資訊
System.out.println(createIndexResponse);
}

驗證結果:創建之后查看下索引是否創建

4.測驗索引是否存在
4. Test If The Index Exists
// 2.測驗索引
@Test
void testExistIndex() throws IOException {
GetIndexRequest getIndexRequest = new GetIndexRequest("wangjiulong_index3");
boolean isExistIndex = restHighLevelClient.indices().exists(getIndexRequest,RequestOptions.DEFAULT);
System.out.println(isExistIndex);
}

驗證結果:如果獲取不存在的索引將會導致報錯

5.洗掉索引
5. Remove The Index
// 3.洗掉索引
@Test
void testDeleteIndex() throws IOException{
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("wangjiulong_index");
AcknowledgedResponse acknowledgedResponse = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println(acknowledgedResponse.isAcknowledged());
}

驗證結果:洗掉之后查看ES是否還能檢索到該索引

驗證結果:洗掉索引后再發送洗掉請求會導致報錯

6.添加檔案
6. Add The Document
準備一個物體類
package com.esproject.demoapi.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
private String name;
private int age;
}

// 4.添加檔案
@Test
void testAddDocument() throws IOException {
//1.創建物件
User user = new User("wangjiulong",15);
//2.創建請求
IndexRequest indexRequest = new IndexRequest("wangjiulong_index");
//3.規則 put/wangjiulong_index/_doc/id
indexRequest.id("1");
indexRequest.timeout(TimeValue.timeValueSeconds(1));//超時設定
//4.將資料放入請求 json
indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
//5.客戶端發送請求
IndexResponse indexResponse = restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);
//6.查看狀態
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}

驗證結果:添加檔案后查看是否能找到該檔案

7.獲取檔案,是否存在
7. Gets The Document, Whether It Exists
//get / index/doc/1
@Test
void getDocument() throws IOException {
//1.創建請求
GetRequest getRequest = new GetRequest("wangjiulong_index","1");
//2.可以設定不獲取回傳的背景關系
getRequest.fetchSourceContext(new FetchSourceContext(false));
getRequest.storedFields("_none_");
boolean bo = restHighLevelClient.exists(getRequest,RequestOptions.DEFAULT);
System.out.println(bo);
}

8.獲取檔案資訊
8. Obtain Document Information
//6. 獲取檔案資訊
@Test
void getDocumentInfo() throws IOException{
GetRequest getRequest = new GetRequest("wangjiulong_index","1");
GetResponse getResponse = restHighLevelClient.get(getRequest,RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString());// 列印檔案內容
System.out.println(getResponse);// 列印物件
}

9.更新檔案資訊
9. Update Document Information
//97.更新檔案資訊
@Test
void updateDocument() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("wangjiulong_index","1");
updateRequest.timeout("1s");// 設定超時時間
User user = new User("王九龍",10);
updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
restHighLevelClient.update(updateRequest,RequestOptions.DEFAULT);
}

驗證結果:查看檔案資訊
10.洗掉檔案記錄
10. Delete Document Record
//8.洗掉檔案記錄
@Test
void deleteDocument() throws IOException {
DeleteRequest deleteIndexRequest = new DeleteRequest("wangjiulong_index","1");
deleteIndexRequest.timeout("1s");
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteIndexRequest,RequestOptions.DEFAULT);
System.out.println(deleteResponse);
}

11.批量的插入資料
11. Batch Inserts
//9. 批量的插入資料
@Test
void addDocuments() throws IOException {//批量匯入
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
User user1 = new User("wang",21);
User user2 = new User("jiu",21);
User user3 = new User("long",21);
User user4 = new User("qin",21);
List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
for(int i=0;i<list.size();i++){
bulkRequest.add(
new IndexRequest("wangjiulong_index")
.id(String.valueOf(i+1))// id不設定會自動生成,這里在實際開發中記得id的唯一性,如果不唯一,將會覆寫原有的id的document的值
.source(JSON.toJSONString(list.get(i)),XContentType.JSON)
);
}
BulkResponse bulkItemResponses = restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);
System.out.println(bulkItemResponses.hasFailures());// 是否失敗 false = 成功
}

12.批量查詢
12. Batch Query
//10.批量查詢
@Test
void searchDocuments() throws IOException {
SearchRequest searchRequest = new SearchRequest("wangjiulong_index");
//構建搜索條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//相當于term查詢,通過QueryBuilders完成查詢條件的構造
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name","qin");
// 例如匹配所有的可以這么寫 : QueryBuilders.matchAllQuery();//匹配所有
searchSourceBuilder.query(termQueryBuilder);
searchSourceBuilder.timeout(TimeValue.timeValueSeconds(1));// 設定超時時間 1s
searchRequest.source(searchSourceBuilder);// 把條件丟進來
SearchResponse searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(searchResponse.getHits()));
System.out.println("=-=-=-=-=-=-=-=-=-=-=-=-=-");
for(SearchHit documentFields:searchResponse.getHits().getHits()){
System.out.println(documentFields.getSourceAsString());
}
}


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/250648.html
標籤:其他
