ES的java操作
一、添加依賴
在pom文件中添加依賴包
<dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</version></dependency><!-- elasticsearch 客戶端 --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.8.0</version></dependency><!-- elasticsearch 依賴 2.x 的 log4j --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.11.1</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.11.1</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.9</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
二、基本框架
package com.wbb.es;import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;public class Elasticsearch_Client {public static void main(String[] args) throws Exception {// 創建ES客戶端RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));/*中間要做的事兒*/// 關閉ES客戶端client.close();}
}
三、索引操作
3.1 創建
創建索引 test_java
// 創建索引
CreateIndexRequest request = new CreateIndexRequest("test_java");
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);// 響應狀態
boolean acknowledged = createIndexResponse.isAcknowledged();
System.out.println("操作轉態 :" + acknowledged);
3.2 查看
// 查詢索引
GetIndexRequest request = new GetIndexRequest("test_java");
// 發送請求
GetIndexResponse response = client.indices().get(request,RequestOptions.DEFAULT);
System.out.println("aliases:"+response.getAliases());
System.out.println("mappings:"+response.getMappings());
System.out.println("settings:"+response.getSettings());
輸出內容
aliases:{test_java=[]}
mappings:{test_java=org.elasticsearch.cluster.metadata.MappingMetadata@e2fe038d}
settings:{test_java={"index.creation_date":"1739345734421","index.number_of_replicas":"1","index.number_of_shards":"1","index.provided_name":"test_java","index.uuid":"R-2HSigUTCSH1mG9kiowrg","index.version.created":"7080099"}}
3.2 刪除索引
// 刪除索引 - 請求對象
DeleteIndexRequest request = new DeleteIndexRequest("test_java");
// 發送請求,獲取響應
AcknowledgedResponse response = client.indices().delete(request,RequestOptions.DEFAULT);
// 操作結果
System.out.println("操作結果 : " + response.isAcknowledged());
四、文檔操作
創建javabean
快捷鍵:定義屬性后 ctrl + shift + a,選擇 Generate …alt + insert,選擇對應的getter和setter
package com.wbb.es;public class test_es {private String name;private Integer age;private String sex;public void setName(String name) {this.name = name;}public void setAge(Integer age) {this.age = age;}public void setSex(String sex) {this.sex = sex;}public String getName() {return name;}public Integer getAge() {return age;}public String getSex() {return sex;}}
4.1創建
4.1.1 添加單個文檔
在索引 test_java下添加文檔編號為001的文檔
// 1、新增文檔 - 請求對象
IndexRequest request = new IndexRequest();
// 2、設置索引及唯一性標識
request.index("test_java").id("001");
// 3、創建數據對象
Test_es test_es = new Test_es();
test_es.setName("tianxuanzhizi");
test_es.setAge(30);
test_es.setSex("男");
ObjectMapper objectMapper = new ObjectMapper();
String productJson = objectMapper.writeValueAsString(test_es);
// 4、添加文檔數據,數據格式為 JSON 格式
request.source(productJson, XContentType.JSON);
// 5、客戶端發送請求,獲取響應對象
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
// 打印結果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());
輸出信息
_index:test_java
_id:001
_result:CREATED
4.1.2 添加多個文檔
//創建批量新增請求對象
BulkRequest request = new BulkRequest();
request.add(new IndexRequest().index("test_java").id("001").source(XContentType.JSON, "name","tianxuanzhizi001", "age", 30, "sex", "男"));
request.add(new IndexRequest().index("test_java").id("002").source(XContentType.JSON, "name","tianxuanzhizi002", "age", 31, "sex", "女"));
//客戶端發送請求,獲取響應對象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
//打印結果信息
System.out.println("took:" + responses.getTook());
System.out.println("items:" + responses.getItems());
輸出結果
took:198ms
items:[Lorg.elasticsearch.action.bulk.BulkItemResponse;@5609159b
4.2 修改
修改 test_java索引下,id為 001 的文檔,sex為”未知“
// 1、修改文檔 - 請求對象
UpdateRequest request = new UpdateRequest();
// 2、配置修改參數
request.index("test_java").id("001");
// 3、設置請求體,對數據進行修改
request.doc(XContentType.JSON, "sex", "未知");
// 客戶端發送請求,獲取響應對象
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());
輸出信息
_index:test_java
_id:001
_result:UPDATED
4.3 查看
//1.創建請求對象
GetRequest request = new GetRequest().index("test_java").id("001");
//2.客戶端發送請求,獲取響應對象
GetResponse response = client.get(request, RequestOptions.DEFAULT);
//3.打印結果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_type:" + response.getType());
System.out.println("_id:" + response.getId());
System.out.println("source:" + response.getSourceAsString());
輸出結果
_index:test_java
_type:_doc
_id:001
source:{"name":"tianxuanzhizi","age":30,"sex":"未知"}
4.4 刪除
4.4.1 刪除單個文檔
//1、創建請求對象
DeleteRequest request = new DeleteRequest().index("test_java").id("001");
//2、客戶端發送請求,獲取響應對象
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
//打印信息
System.out.println(response.toString());
輸出信息
DeleteResponse[index=test_java,type=_doc,id=001,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]
4.4.2 刪除多個文檔
//創建批量刪除請求對象
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index("test_java").id("001"));
request.add(new DeleteRequest().index("test_java").id("002"));
//客戶端發送請求,獲取響應對象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
//打印結果信息
System.out.println("took:" + responses.getTook());
System.out.println("items:" + responses.getItems());
System.out.println("items:" + responses.getItems());
輸出信息
took:201ms
items:[Lorg.elasticsearch.action.bulk.BulkItemResponse;@7c9d8e2
items:[Lorg.elasticsearch.action.bulk.BulkItemResponse;@7c9d8e2
4.5 查詢
4.5.1 查詢的基本框架
package com.wbb.es;import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;public class Elasticsearch_Client {public static void main(String[] args) throws Exception {// 創建ES客戶端RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));// 創建搜索請求對象SearchRequest request = new SearchRequest();request.indices("test_java");// 構建查詢的請求體SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();/*查詢設置*/request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 查詢匹配SearchHits hits = response.getHits();System.out.println("took:" + response.getTook());System.out.println("timeout:" + response.isTimedOut());System.out.println("total:" + hits.getTotalHits());System.out.println("MaxScore:" + hits.getMaxScore());System.out.println("========doc=========");for (SearchHit hit : hits) {//輸出每條查詢的結果信息System.out.println(hit.getSourceAsString());}// 關閉ES客戶端client.close();}
}
4.5.1 查詢所有文檔
sourceBuilder.query(QueryBuilders.matchAllQuery());
輸出信息
took:2ms
timeout:false
total:2 hits
MaxScore:1.0
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
{"name":"tianxuanzhizi002","age":31,"sex":"女"}
4.5.2 按照字段名進行查詢
sourceBuilder.query(QueryBuilders.termQuery("age", "30"));
輸出
took:3ms
timeout:false
total:1 hits
MaxScore:1.0
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
4.5.3 分頁查詢
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 分頁查詢
// 分頁起始位置(第一條數據的順序號)
sourceBuilder.from(0);
// 每頁顯示多少條
sourceBuilder.size(2);
輸出
took:2ms
timeout:false
total:2 hits
MaxScore:1.0
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
{"name":"tianxuanzhizi002","age":31,"sex":"女"}
4.5.4 排序查詢
按照年齡排序
sourceBuilder.query(QueryBuilders.matchAllQuery());
sourceBuilder.sort("age", SortOrder.ASC);
4.5.5 過濾字段
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 只查看 name 和 age
String[] excludes = {};
String[] includes = {"name", "age"};
sourceBuilder.fetchSource(includes, excludes);
4.5.6 組合查詢
// 構建查詢的請求體
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 必須包含
boolQueryBuilder.must(QueryBuilders.matchQuery("age", "30"));
// 一定不含
boolQueryBuilder.mustNot(QueryBuilders.matchQuery("name", "bug"));
// 可能包含
boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "男"));sourceBuilder.query(boolQueryBuilder);
輸出結果
took:3ms
timeout:false
total:1 hits
MaxScore:1.6931472
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
4.5.7 范圍查詢
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
// 大于等于
rangeQuery.gte("30");
// 小于等于
rangeQuery.lte("40");
sourceBuilder.query(rangeQuery);
4.5.8 模糊查詢
sourceBuilder.query(QueryBuilders.fuzzyQuery("name","tianxuanzhizi").fuzziness(Fuzziness.ONE));
4.5.9 高亮查詢
//構建查詢方式:高亮查詢
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name","tianxuanzhizi001");
//設置查詢方式
sourceBuilder.query(termsQueryBuilder);
//構建高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color='red'>");//設置標簽前綴
highlightBuilder.postTags("</font>");//設置標簽后綴
highlightBuilder.field("name");//設置高亮字段
//設置高亮構建對象
sourceBuilder.highlighter(highlightBuilder);
輸出前設置高亮顏色
//打印高亮結果 Map<String, HighlightField> highlightFields = hit.getHighlightFields()System.out.println(highlightFields);;
查詢結果
took:171ms
timeout:false
total:1 hits
MaxScore:1.0
========doc=========
{name=[name], fragments[[<font color='red'>tianxuanzhizi001</font>]]}
4.5.9 聚合查詢
查詢最大年齡
sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age"));
輸出response
System.out.println(response);
輸出結果
{"took":2,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":2,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"test_java","_type":"_doc","_id":"001","_score":1.0,"_source":{"name":"tianxuanzhizi001","age":30,"sex":"男"}},{"_index":"test_java","_type":"_doc","_id":"002","_score":1.0,"_source":{"name":"tianxuanzhizi002","age":31,"sex":"女"}}]},"aggregations":{"max#maxAge":{"value":31.0}}}
4.5.10 分組聚合
按性別分組
sourceBuilder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));
輸出response
System.out.println(response);
輸出結果
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":2,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"test_java","_type":"_doc","_id":"001","_score":1.0,"_source":{"name":"tianxuanzhizi001","age":30,"sex":"男"}},{"_index":"test_java","_type":"_doc","_id":"002","_score":1.0,"_source":{"name":"tianxuanzhizi002","age":31,"sex":"女"}}]},"aggregations":{"lterms#age_groupby":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":30,"doc_count":1},{"key":31,"doc_count":1}]}}}