本文轉自SDK社區:sdk.cn
一、創建連接
!ps:RestHighLevelClient是官方指定的連接API。另外一個是TransportClient,但是TransportClient這個是已經廢棄不用的,所以會在ES8.0之后完全移除,也就是說8.0之后就無法使用了
RestHighLevelClient的maven依賴為(使用前必須添加相應依賴)
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.9.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.9.2</version>
</dependency>
注意:以上的依賴版本可以根據你使用的ES的版本來定,向下兼容,但是無法向上兼容
創建連接
static String ip = "localhost";
static int port = 9200;
static RestHighLevelClient restHighLevelClient = null;
static TransportClient client = null;
static RestHighLevelClient initClient(){
//這里的RestClient.builder(new HttpHost(ip,port),.........)支持多個httphost連接,也就是支持連接多個elasticsearch
restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost(ip,port)));
}
static Connection getInstance(){
synchronized (ElasticSearchFactory.class){
if (restHighLevelClient == null){
restHighLevelClient = initClient();
}
}
return connection;
}
RestHighLevelClient 支持對ES的增刪改查、批量操作
新增:
public static void creatIndex(String json){
IndexRequest indexRequest = new IndexRequest("test_index","String");
indexRequest.source(json, XContentType.JSON);//這里的json為存入ES的文檔內容
try {
restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);//RequestOptions在新方法中必須選擇
} catch (IOException e) {
e.printStackTrace();
}
}
查詢:
查詢支持直接查詢和條件查詢,由於ES是根據索引、文檔類型和文檔ID確定一個唯一的文檔的,所以直接查詢必須要有索引和類型還有ID
public static Map<String, Object> getIndex(String indexName,String type,String id){
GetRequest request = new GetRequest(indexName);
//SearchRequest searchRequest = new SearchRequest(indexName);
try {
GetResponse search = restHighLevelClient.get(request, RequestOptions.DEFAULT);
Map<String, Object> source = search.getSource();
return source;
} catch (IOException e) {
e.printStackTrace();
}
return new HashMap<>();
}
條件查詢:
條件查詢支持所有的ES的查詢規則
public static Map<String, Object> searchIndex(String indexName){
//GetRequest request = new GetRequest(indexName);
//SearchRequest searchRequest = new SearchRequest(indexName);
QueryBuilder queryBuilders = QueryBuilders.boolQuery().filter(
QueryBuilders.termQuery("queryKey","吱吱吱ZZZ")
);
SearchRequest searchRequest = new SearchRequest();
//searchRequest.indices("posts");這里可以設計GEET或者POST
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// searchSourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));支持按評分排序,評分是指分詞之后取得的文檔相似度評分
searchSourceBuilder.query(QueryBuilders.boolQuery().filter(QueryBuilders.termQuery("queryKey.keyword","吱吱吱ZZZ")));
searchRequest.source(searchSourceBuilder);
try {
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = search.getHits().getHits();
for (SearchHit searchHit : hits){
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
System.out.println("source : {}" + sourceAsMap.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
return new HashMap<>();
}
修改:
ps:ES中其實並不存在真正意義上的修改,其實是進行的文檔覆蓋,先將原文檔查出來標記刪除,然后在原文檔的基礎上添加上修改形成一份新文檔,存入ES中,之后再將打上刪除標記的文檔刪除。
public static void updateIndex(String indexName, String type, String id, String json){
UpdateRequest request = new UpdateRequest(indexName, type, id);
request.doc(json, XContentType.JSON);
try {
UpdateResponse updateResponse = restHighLevelClient.update(request,RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
}
刪除:
public static void deleteIndex(String indexName, String type, String id){
DeleteRequest request = new DeleteRequest(indexName,type,id);
try {
restHighLevelClient.delete(request,RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
}
bulk操作,bulk操作相當於批處理,能夠在一次操作中處理一批數據,同時能夠同時處理,增刪改操作
public static void bulkIndex(){
BulkRequest request = new BulkRequest();
String jsonString="{\n" +
"\t\"databaseId\": \"謝謝謝謝謝謝\",\n" +
"\t\"databaseType\": \"嘻嘻嘻\",\n" +
"\t\"queryKey\":\"吱吱吱ZZZ\"\n" +
"}\n";
UUID uuid = UUID.randomUUID();
request.add(new IndexRequest("test_index", "String", uuid.toString())
.source(jsonString,XContentType.JSON));
String updateJson="{\n" +
" \"queryKey\":\"吱吱吱ZZZ\"\n" +
"}";
request.add(new UpdateRequest("test_index", "String", uuid.toString())
.doc(updateJson,XContentType.JSON));
request.add(new DeleteRequest("test_index", "String", uuid.toString()));
try {
restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
}
執行ES-DSL
String json = "{\"bool\":{\"filter\":[{\"term\":{\"queryKey.keyword\":\"吱吱吱ZZZ\"}}]}}";
String index= "test_index";
public static void wapQuerty(String json,String index){
WrapperQueryBuilder queryBuilder = new WrapperQueryBuilder(json);
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(queryBuilder);
searchRequest.source(searchSourceBuilder).indices(index);
try {
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = search.getHits().getHits();
for (SearchHit searchHit : hits){
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
String id = searchHit.getId();
System.out.println("id:"+id);
}
} catch (IOException e) {
e.printStackTrace();
}
}