
小編使用的是elasticsearch-7.3.2

基礎(chǔ)說明:
啟動(dòng):進(jìn)入elasticsearch-7.3.2/bin目錄,雙擊elasticsearch.bat進(jìn)行啟動(dòng),當(dāng)出現(xiàn)一下界面說明,啟動(dòng)成功。也可以訪問http://localhost:9200/



啟動(dòng)ES管理:進(jìn)入elasticsearch-head-master文件夾,然后進(jìn)入cmd命令界面,輸入npm?run?start?即可啟動(dòng)。訪問http://localhost:9100/?啟動(dòng)成功。



下面是springboot使用ES的準(zhǔn)備工作:
導(dǎo)入相關(guān)依賴:
? ? ? ? <dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.3.2</version>
</dependency>
<dependency>
<groupId>com.sksamuel.elastic4s</groupId>
<artifactId>elastic4s_2.11</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.配置ES,創(chuàng)建配置類:CommonConfig
@Configuration
public class CommonConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
return new RestHighLevelClient(
RestClient.builder(
//若有多個(gè),可以傳一個(gè)數(shù)組
new HttpHost("127.0.0.1", 9200, "http")));
}
}
到此,springboot需要使用ES的配置就基本完成了,下面讓我們開始進(jìn)行Java?對(duì)ES?的基本操作和以及復(fù)雜操作吧。
基礎(chǔ)操作:
創(chuàng)建ES索引:(創(chuàng)建表)
@Service
@Slf4j
public class TestService {
@Autowired
public RestHighLevelClient client;
public String createESindex() throws IOException {
//1、構(gòu)建 創(chuàng)建索引的請(qǐng)求
CreateIndexRequest request = new CreateIndexRequest("base_data");//索引名
//2、客戶端執(zhí)行請(qǐng)求,獲取響應(yīng)
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
//3、打印
System.out.println("創(chuàng)建成功,創(chuàng)建的索引名為:" + response.index());
return "success";
}
}


獲取索引,判斷索引是否存在:(判斷表是否存在)
public String getESindex() throws IOException {
//1、構(gòu)建 獲取索引的請(qǐng)求
GetIndexRequest request = new GetIndexRequest("base_data");
//2、客戶端判斷該索引是否存在
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
//3、打印
System.out.println("該索引是否存在:"+exists);
return "success";
}
刪除索引:(刪除表)
public String deleteESindex() throws IOException {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("base_data");
AcknowledgedResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println("刪除索引==>"+deleteIndexResponse.isAcknowledged());
return “success”;
}

創(chuàng)建文檔:(創(chuàng)建表并插入一條數(shù)據(jù))
public String createESdata() throws IOException {
Map<String,Object> base_data=new HashMap<>();
base_data.put("id","a1234");
base_data.put("title","張三");
base_data.put("gender","男");
base_data.put("age","23");
base_data.put("sort_int",1);
base_data.put("time_date","2023-02-25 13:55:23");
base_data.put("is_delete","0");
//1、構(gòu)建請(qǐng)求
IndexRequest request = new IndexRequest("base_data");
//2、設(shè)置規(guī)則 PUT /user_index/user/_doc/1
request.id(base_data.get("id")+"");//設(shè)置id
request.timeout(TimeValue.timeValueSeconds(1));//設(shè)置超時(shí)時(shí)間
//3、將數(shù)據(jù)放入到請(qǐng)求中,以JSON的格式存放
request.source(JSONObject.toJSONString(base_data), XContentType.JSON);
//4、客戶端發(fā)送請(qǐng)求,獲取響應(yīng)結(jié)果
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
//5、打印
System.out.println("響應(yīng)結(jié)果:"+response.toString());
return "success";
}


獲取文檔:(查詢表的數(shù)據(jù))
public String getESdata() throws IOException {
//獲取id為1的文檔的信息
GetRequest request = new GetRequest("base_data","a1234");
boolean exists = client.exists(request, RequestOptions.DEFAULT);
System.out.println("文檔是否存在:"+exists);
//如果存在,獲取文檔信息
if (exists){
GetResponse response = client.get(request, RequestOptions.DEFAULT);
System.out.println("文檔內(nèi)容為:"+response.getSourceAsString());
}
return "success";
}

修改文檔:(修改表中的一條數(shù)據(jù))
public String updateESdata() throws IOException {
//更新id為1的文檔的信息
UpdateRequest request = new UpdateRequest("base_data", "a1234");
Map<String,Object> setdata=new HashMap<>();
setdata.put("title","鎧甲");
request.doc(JSONObject.toJSONString(setdata), XContentType.JSON);
//客戶端執(zhí)行更新請(qǐng)求
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("更新狀態(tài):" +response.status());
return "success";
}


刪除一條文檔:(刪除表中的一條數(shù)據(jù))
public?String deleteESdata() throws IOException {
//構(gòu)建刪除請(qǐng)求
DeleteRequest request = new DeleteRequest("base_data", "a1234");
//客戶端執(zhí)行刪除請(qǐng)求,并獲取響應(yīng)結(jié)果
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
//打印
System.out.println("刪除狀態(tài):"+response.status());
? ? return?"success";
}

批量創(chuàng)建數(shù)據(jù):(創(chuàng)建表并插入數(shù)據(jù))
public String batchinsESdata() throws IOException {
//構(gòu)建批量插入的請(qǐng)求
BulkRequest request = new BulkRequest();
//設(shè)置超時(shí)時(shí)間
request.timeout("10s");
? ? ? ? //構(gòu)建測(cè)試數(shù)據(jù)
List<Map<String,Object>> data=new ArrayList<>();
Map<String,Object> datamap=null;
for (int i = 0; i < 20; i++) {
datamap=new HashMap<>();
if(i<5){
datamap.put("id","a123b"+i);
datamap.put("title","財(cái)務(wù)"+i);
datamap.put("user","王剛"+i);
datamap.put("sort_int",6);
datamap.put("is_delete","0");
datamap.put("time_date",StringTimeUtil.now());
}else if(i>5&&i<10){
datamap.put("id","a456b"+i);
datamap.put("title","能源"+i);
datamap.put("user","洪河"+i);
datamap.put("sort_int",i+1);
datamap.put("is_delete","0");
datamap.put("time_date","2023-02-28 12:33:55");
}else if(i>10&&i<15){
datamap.put("id","a789b"+i);
datamap.put("title","光度"+i);
datamap.put("user","時(shí)光"+i);
datamap.put("sort_int",i+1);
datamap.put("is_delete","0");
datamap.put("time_date","2023-02-27 12:33:55");
}else{
datamap.put("id","c123d"+i);
datamap.put("title","鎧甲"+i);
datamap.put("user","迪迦"+i);
datamap.put("sort_int",i+1);
datamap.put("is_delete","0");
datamap.put("time_date","2023-02-25 12:33:55");
}
data.add(datamap);
}
//批量插入請(qǐng)求設(shè)置
for (int i = 0; i < data.size(); i++) {
request.add( new IndexRequest("base_data")//設(shè)置索引
.id(data.get(i).get("id")+"")//設(shè)置文檔的id,如果沒有指定,會(huì)隨機(jī)生成,自己測(cè)試
.source(JSONObject.toJSONString(data.get(i)), XContentType.JSON)//設(shè)置要添加的資源,類型為JSON
);
}
BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
System.out.println("批量插入是否失?。?+response.hasFailures());
return "success";
}


精確查詢:(根據(jù)ID查詢表中的一條數(shù)據(jù))
public String queryESdata() throws IOException {
//1、構(gòu)建搜索請(qǐng)求
SearchRequest request = new SearchRequest("base_data");
//2、設(shè)置搜索條件,使用該構(gòu)建器進(jìn)行查詢
SearchSourceBuilder builder = new SearchSourceBuilder();//生成構(gòu)建器
//構(gòu)建精確匹配查詢條件
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("_id.keyword", "c123d10");
builder.query(termQueryBuilder);
//3、將搜索條件放入搜索請(qǐng)求中
request.source(builder);
//4、客戶端執(zhí)行搜索請(qǐng)求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//5、打印測(cè)試
SearchHit[] hits = response.getHits().getHits();
System.out.println("共查詢到"+hits.length+"條數(shù)據(jù)");
System.out.println("查詢結(jié)果:");
for (int i = 0; i < hits.length; i++) {
System.out.println(hits[i].getSourceAsString());
}
return "success";
}

復(fù)雜操作:
1.分頁排序查詢:(表查詢的?limit?order?by)
public String paginggetESdata() throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.from(1);
searchSourceBuilder.size(8);
searchSourceBuilder.trackTotalHits(true);
searchSourceBuilder.sort(SortBuilders.fieldSort("sort_int").order(SortOrder.DESC));//降序
//searchSourceBuilder.sort(SortBuilders.fieldSort("sort_int").order(SortOrder.ASC));//升序
SearchRequest searchRequest = new SearchRequest("base_data");
searchRequest.source(searchSourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = search.getHits().getHits();
System.out.println("ES分頁查詢返回?cái)?shù)據(jù)條數(shù)==>"+hits.length);
for(SearchHit hit: hits){
JSONObject data_json = JSONObject.parseObject(hit.getSourceAsString());
System.out.println(data_json);
}
return "success";
}

2.按條件查詢某些字段:(表查詢的select?xxx,xxx,xxx?from?xxx?where?xxx='xxx'?and?xxx?like?'%xxx%')
public String getfieldESdata() throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryBuilder dim_q = QueryBuilders.wildcardQuery("title.keyword", "*財(cái)務(wù)*");//模糊查詢
QueryBuilder qeual_q = QueryBuilders.matchPhraseQuery("id", "a123b3");//等量查詢
RangeQueryBuilder rang_q=QueryBuilders.rangeQuery("time_date.keyword").from("2023-03-06 15:00:32").to("2023-03-06 19:05:32");//日期區(qū)間查詢
searchSourceBuilder.query(QueryBuilders.boolQuery().must(dim_q).must(qeual_q).must(rang_q));
//查詢指定字段
String[] includeFields = new String[]{"id","title","time_date"};
String[] excludeFields = new String[] {""};
searchSourceBuilder.fetchSource(includeFields, excludeFields);
SearchRequest searchRequest = new SearchRequest("base_data");
searchRequest.source(searchSourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = search.getHits().getHits();
System.out.println("ES復(fù)雜查詢返回?cái)?shù)據(jù)條數(shù)==>"+hits.length);
for(SearchHit hit: hits){
JSONObject data_json = JSONObject.parseObject(hit.getSourceAsString());
System.out.println(data_json);
}
return "success";
}


3.按條件修改某些字段的值:(表修改的update?xxx?set?xxx='xxx',xxx='xxx'?where?xxx='xxx'?and?xxx='xxx')
public String updatebyqueryESdata() throws IOException {
UpdateByQueryRequest request = new UpdateByQueryRequest("base_data");
QueryBuilder upd_q1 = QueryBuilders.matchPhraseQuery("is_delete", "0");//等量條件
QueryBuilder upd_q2 = QueryBuilders.wildcardQuery("title.keyword", "*財(cái)務(wù)*");//模糊條件
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery().must(upd_q1).must(upd_q2);
String setdata="ctx._source['user']='修改的user';ctx._source['sort_int']=100;ctx._source['title']='修改的title';";
request.setQuery(queryBuilder);
request.setScript(new Script(setdata));
BulkByScrollResponse response = client.updateByQuery(request, RequestOptions.DEFAULT);
System.out.println("受影響行數(shù)==>"+response.getStatus().getUpdated());
return "";
}



4.按條件刪除文檔里面的數(shù)據(jù):(表刪除的delete?from?xxx?where?xxx='xxx'?and?xxx='xxx')文章來源:http://www.zghlxwxcb.cn/news/detail-756590.html
public String deletebyqueryESdata() throws IOException {
DeleteByQueryRequest request = new DeleteByQueryRequest("base_data");
QueryBuilder upd_q1 = QueryBuilders.matchPhraseQuery("is_delete", "0");//等量條件
QueryBuilder upd_q2 = QueryBuilders.wildcardQuery("title.keyword", "*修改的*");//模糊條件
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery().must(upd_q1).must(upd_q2);
request.setQuery(queryBuilder);
BulkByScrollResponse response = client.deleteByQuery(request, RequestOptions.DEFAULT);
System.out.println("受影響行數(shù)==>"+response.getStatus().getUpdated());
return "success";
}



以上就是小編自學(xué)并根據(jù)網(wǎng)絡(luò)整理的,Java?Springboot?操作ES的一些常用業(yè)務(wù)。整理不易,請(qǐng)大家多多支持,如有不足之處,歡迎大家留言討論。文章來源地址http://www.zghlxwxcb.cn/news/detail-756590.html
到了這里,關(guān)于Java SpringBoot API 實(shí)現(xiàn)ES(Elasticsearch)搜索引擎的一系列操作(超詳細(xì))(模擬數(shù)據(jù)庫操作)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!