3、java操作ES篇
3.1、摸索java鏈接ES的流程
- 自行創建一個maven項目
3.1.1、依賴管理
<properties>
<ES-version>7.8.0</ES-version>
<log4j-version>1.2.17</log4j-version>
<junit-version>4.13.2</junit-version>
<jackson-version>2.13.0</jackson-version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<!-- 注意:這里的版本問題,要和下載的window的ES版本一致,甚至后續用linux搭建也是一樣的
到時用linux時,ES、kibana的版本都有這樣的限定
-->
<version>${ES-version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<!-- 注意:這里別搞成了elasticsearch-client
這個東西在7.x已經不推薦使用了,而到了8.0之后,這個elasticsearch-client已經完全被廢棄了
-->
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<!-- 同樣的,注意版本問題 -->
<version>${ES-version}</version>
</dependency>
<!-- 這個我其實沒用,要用的話,可以導入:log4j-api和log4j-core -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j-version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
</dependencies>
</dependencyManagement>
3.1.2、摸索鏈接流程
3.1.2.1、獲取父項目中的依賴
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
3.1.2.2、摸索流程
package cn.zixieqing;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName ConnectionTest
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class ConnectionTest {
/*
* @Author ZiXieQing
* @Description // TODO 測試java鏈接ES
* @Date 2021/12/14
* @Param
* @return
*/
// 下面這個邏輯,對照shiro中的realm、manager、FilterFactoryBean的邏輯來看( 沒用過的就當我沒說^_^ )
@Test
public void test() throws IOException {
// 3、創建HttpHost
HttpHost host = new HttpHost("127.0.0.1", 9200);// 發現需要:String hostname, int port 這就很簡單了澀
// 當然:這個方法重載中有一個參數scheme 這個是:訪問方式 根據需求用http / https都可以 這里想傳的話用:http就可以了
// 2、創建RestClientBuilder 但是:點擊源碼發現 - 沒有構造方法
// 既然沒有,那肯定提供得有和xml版的mybatis加載完xml文件之后的builder之類的,找一下
RestClientBuilder clientBuilder = RestClient.builder(host);
// 發現1、有重載;2、重載之中有幾個參數,而HttpHost... hosts 這個參數貌似貼近我們想要的東西了,所以建一個HttpHost
// 1、要鏈接client,那肯定需要一個client咯,正好:導入得有high-level-client
RestHighLevelClient esClient = new RestHighLevelClient(clientBuilder); // 發現需要RestClientBuilder,那就建
// 4、測試:只要 esClient. 就可以看到一些很熟悉的方法,可以在這里測試調一下哪些方法,然后去postman中獲取數據看一下對不對
// 這里不多做說明:java鏈接ES客戶端的流程就是上面這樣的,不過:這和MySQL數據庫鏈接一樣,記得不用了就關閉
esClient.close(); // 當然:封裝之后,這個關閉操作應該放出來,然后在封裝的工具中只需要返回這個鏈接對象即可
}
}


3.2、java中操作ES索引
3.2.1、向父項目獲取自己要的依賴
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.2.2、封裝鏈接對象
package cn.zixieqing.utile;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
/**
* @ClassName ESClientUtil
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class ESClientUtil {
private static final String HOST = "127.0.0.1"; // 用localhost也行,不過后面用linux就要ip,所以:算在這里養成習慣吧
private static final Integer PORT = 9200;
public static RestHighLevelClient getESClient() {
return new RestHighLevelClient( RestClient.builder( new HttpHost( HOST, PORT ) ) );
}
}

3.2.3、創建索引
package cn.zixieqing;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName CreateIndex
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class CreateIndex {
@Test
public void createIndexTest() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
// 創建索引
// CreateIndexRequest() 第一個參數:要創建的索引名 第二個參數:請求選項 默認即可
CreateIndexResponse response = esClient.indices().create(
new CreateIndexRequest("person"), RequestOptions.DEFAULT );
// 查看是否添加成功 核心方法:isAcknowledged()
System.out.println( response.isAcknowledged() );
esClient.close();
}
}

用postman檢驗一下:

3.2.4、查詢索引
package cn.zixieqing.index;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName SearchIndex
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class SearchIndex {
/*
* @Author ZiXieQing
* @Description // TODO 查詢索引
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void searchIndexTest() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
// 獲取索引
GetIndexResponse response = esClient.indices().get(
new GetIndexRequest("person"), RequestOptions.DEFAULT );
// 熟悉GetIndexResponse中的幾個api
System.out.println( "Aliases" + response.getAliases() );
System.out.println( "Mappings" + response.getMappings() );
System.out.println( "Settings" + response.getSettings() ); // 這三者在用postman玩的時候,返回結果中都有
esClient.close();
}
}


3.2.5、刪除索引
package cn.zixieqing.index;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName DeleteIndex
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class DeleteIndex {
/*
* @Author ZiXieQing
* @Description // TODO 刪除索引
* @Date 2021/12/14
* @Param
* @return
*/
@Test
public void deleteIndexTest() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
// 刪除索引
AcknowledgedResponse response = esClient.indices().delete(
new DeleteIndexRequest("person"), RequestOptions.DEFAULT );
// 檢驗一下:是否刪除成功
System.out.println( response.isAcknowledged() );
esClient.close();
}
}

用postman再檢測一下:

3.3、java操作ES中的_doc - 重點中的重點
3.3.1、創建doc
- 這里還需要jackson-databind:前面已經導入
- 同時:為了偷懶,所以把lombok也一起導入了
- 父項目依賴管理
<lombok-version>1.18.22</lombok-version>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok-version}</version>
</dependency>
子項目獲取依賴:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
編寫實體類
package cn.zixieqing.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @ClassName UserEntity
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Accessors(chain = true) // lombok的鏈式調用
public class UserEntity implements Serializable {
private String id;
private String name;
private String sex;
}
測試:
package cn.zixieqing.doc;
import cn.zixieqing.entity.UserEntity;
import cn.zixieqing.utile.ESClientUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName InsertDoc
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class InsertDoc {
/*
* @Author ZiXieQing
* @Description // TODO 新增文檔_doc,當然下面這個過程利用ESClient封裝的思路也可以抽離
* @Date 2021/12/14
* @Param
* @return
*/
@Test
public void insertDocTest() throws IOException {
// 1、獲取鏈接
RestHighLevelClient esClient = ESClientUtil.getESClient();
IndexRequest request = new IndexRequest();
// 選擇索引及設置唯一標識
request.index("user").id("10002");
// 2、添加數據
// IndexRequest和IndexResponse這中間就是:做添加doc操作
UserEntity userEntity = new UserEntity();
userEntity.setId( "100" ).setName( "紫邪情" ).setSex( "女" ); // lombok鏈式調用
// 轉json 注:objectMapper是jackson-databind中的,不是ES中的
String userJson = new ObjectMapper().writeValueAsString( userEntity );
// 把轉成的json字符串存到ES中去
request.source( userJson , XContentType.JSON);
// 3、發起請求 獲取響應對象
IndexResponse response = esClient.index( request, RequestOptions.DEFAULT );
// 看看這個IndexResponse有哪些有用的api
System.out.println( "響應轉態:" + response.getResult() ); // 其他的一點 就可以看到了,都是字面意思
esClient.close();
}
}

**postman檢測一下:

我的測試結構如下:

3.3.2、修改doc
- 這個修改是指的局部修改,全量修改就不用想了
package cn.zixieqing.doc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName UpdateDoc
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class UpdateDoc {
/*
* @Author ZiXieQing
* @Description // TODO 修改doc
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void UpdateDoc() throws IOException {
// 1、獲取鏈接對象
RestHighLevelClient esClient = ESClientUtil.getESClient();
UpdateRequest request = new UpdateRequest();
// 獲取索引
request.index("user").id("10002");
// 2、修改doc數據
request.doc(XContentType.JSON, "name", "邪公子");
// 3、發起請求、獲得響應對象
UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);
System.out.println( "響應狀態為:" + response.getResult() );
esClient.close();
}
}

postman檢驗一下:

3.3.3、查詢doc
package cn.zixieqing.doc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName GetDoc
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class GetDoc {
@Test
public void getDocTest() throws IOException {
// 1、獲取鏈接對象
RestHighLevelClient esClient = ESClientUtil.getESClient();
GetRequest request = new GetRequest();
request.index("user").id("10002");
// 2、發起請求、獲取響應對象
GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
// 3、獲取結果 推薦用getSourceAsString()
String result = response.getSourceAsString();
System.out.println( "獲得的doc為:" + result );
esClient.close();
}
}

3.3.4、刪除doc
package cn.zixieqing.doc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName DeleteDoc
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class DeleteDoc {
/*
* @Author ZiXieQing
* @Description // TODO 刪除doc
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void deleteDocTest() throws IOException {
// 1、獲取鏈接對象
RestHighLevelClient esClient = ESClientUtil.getESClient();
DeleteRequest request = new DeleteRequest();
// 獲取索引
request.index("user").id("10002");
// 2、做刪除操作
DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
System.out.println( "響應狀態為:" + response.getResult() );
// 3、關閉鏈接
esClient.close();
}
}

再次獲取檢驗一下:

3.4.5、批量新增_doc數據
- 本質:把請求封裝了而已,從而讓這個請求可以傳遞各種類型參數,如:刪除的、修改的、新增的,這樣就可以搭配for循環
package cn.zixieqing.doc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName BatchDeleteDoc
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class BatchInsertDoc {
/*
* @Author ZiXieQing
* @Description // TODO 批量添加doc數據
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void batchInsertDocTest() throws IOException {
// 1、獲取鏈接對象
RestHighLevelClient esClient = ESClientUtil.getESClient();
BulkRequest request = new BulkRequest();
// 當然:source的第二個參數都是傳個對象,這里為了偷懶,嫖了別人的代碼
request.add( new IndexRequest()
.index("user")
.id("520")
.source( XContentType.JSON, "name", "小紫1") );
request.add( new IndexRequest()
.index("user")
.id("521")
.source( XContentType.JSON, "name", "小紫2") );
request.add( new IndexRequest()
.index("user")
.id("522")
.source( XContentType.JSON, "name", "小紫3") );
// 2、發送請求
BulkResponse response = esClient.bulk( request, RequestOptions.DEFAULT );
// 查看執行時間
System.out.println( response.getTook() );
esClient.close();
}
}

postman檢驗一下:
http://127.0.0.1:9200/user/_search 請求方式 get
// 返回結果
{
"took": 585,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "user",
"_type": "_doc",
"_id": "520",
"_score": 1.0,
"_source": {
"name": "小紫1"
}
},
{
"_index": "user",
"_type": "_doc",
"_id": "521",
"_score": 1.0,
"_source": {
"name": "小紫2"
}
},
{
"_index": "user",
"_type": "_doc",
"_id": "522",
"_score": 1.0,
"_source": {
"name": "小紫3"
}
}
]
}
}
3.4.6、批量刪除_doc數據
- 本質:把請求封裝了而已,從而讓這個請求可以傳遞各種類型參數,如:刪除的、修改的、新增的,這樣就可以搭配for循環
package cn.zixieqing.doc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName BarchDeleteDoc
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class BatchDeleteDoc {
/*
* @Author ZiXieQing
* @Description // TODO 批量刪除doc數據
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void batchDeleteDoc() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
BulkRequest request = new BulkRequest();
// 和批量添加相比,變的地方就在這里而已
request.add(new DeleteRequest().index("user").id("520"));
request.add(new DeleteRequest().index("user").id("521"));
request.add(new DeleteRequest().index("user").id("522"));
BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
System.out.println(response.getTook());
esClient.close();
}
}

postman檢驗一下:

3.4.7、高級查詢 - 重點
3.4.7.1、全量查詢
package cn.zixieqing.docHighLevel.queryDoc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName MatchAll
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class MatchAll {
/*
* @Author ZiXieQing
* @Description // TODO 高級查詢 - 全量查詢 就是基礎語法中在請求體內使用match_all那個知識點
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void matchAllTest() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
// 全量查詢 match_all
SearchResponse response = esClient.search( new SearchRequest()
.indices("user")
.source(
new SearchSourceBuilder()
.query( QueryBuilders.matchAllQuery() )
), RequestOptions.DEFAULT );
// 查看執行了多少時間
System.out.println( response.getTook() );
// 把數據遍歷出來看一下
for ( SearchHit data : response.getHits() ) {
System.out.println( data.getSourceAsString() );
}
esClient.close();
// 上面的看不懂,那就看下面拆分的過程
// // 1、獲取鏈接對象
// RestHighLevelClient esClient = ESClientUtil.getESClient();
//
// // 3、創建SearchRequest對象
// SearchRequest request = new SearchRequest();
// request.indices("user");
//
// // 5、創建SearchSourceBuilder對象
// SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//
// // 6、進行查詢 發現:需要QueryBuilders對象,看源碼發現:沒有構造,可是:有matchAllQuery()
// searchSourceBuilder.query( QueryBuilders.matchAllQuery() );
//
// // 4、調用source()方法獲取數據,但是發現:需要SearchSourceBuilder,繼續創建
// request.source( searchSourceBuilder );
//
// // 2、發送請求 發現:需要SearchRequest 那就建一個
// SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
// // 7、獲取數據
// for (SearchHit data : response.getHits()) {
// System.out.println( data.getSourceAsString() );
// }
//
// // 8、關閉鏈接
// esClient.close();
}
}

3.4.7.2、條件查詢
package cn.zixieqing.docHighLevel.queryDoc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName TermQuery
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class TermQuery {
/*
* @Author ZiXieQing
* @Description // TODO term條件查詢 注意:這里不是說的基礎篇中的 filter range 那個條件啊( 這個條件要求的是查詢字段為int類型的 )
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void termQueryTest() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
// 條件查詢
SearchResponse response = esClient.search( new SearchRequest()
.indices("user")
.source( new SearchSourceBuilder()
.query( QueryBuilders.termQuery("_id", "520" ) ) ), // 對照全量查詢:變的就是這里的方法調用
RequestOptions.DEFAULT );
for (SearchHit data : response.getHits()) {
System.out.println( data.getSourceAsString() );
}
esClient.close();
}
}

3.4.7.3、分頁查詢
package cn.zixieqing.docHighLevel.queryDoc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName LimitQuery
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class LimitQuery {
/*
* @Author ZiXieQing
* @Description // TODO 分頁查詢 對應基礎篇中的from size
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void limitQueryTest() throws IOException {
// 1、獲取鏈接對象
RestHighLevelClient esClient = ESClientUtil.getESClient();
// 3、創建SearchSourceBuilder
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 4、查詢出所有的數據
SearchSourceBuilder sourceBuilder = searchSourceBuilder.query( QueryBuilders.matchAllQuery() );
// 5、對數據進行分頁操作
sourceBuilder.from(0);
sourceBuilder.size(2);
// 2、發送請求
SearchResponse response = esClient.search( new SearchRequest()
.indices("user")
.source( searchSourceBuilder )
, RequestOptions.DEFAULT );
// 7、查看數據
for (SearchHit data : response.getHits()) {
System.out.println( data.getSourceAsString() );
}
// 8、關閉鏈接
esClient.close();
}
}

3.4.7.4、排序查詢
package cn.zixieqing.docHighLevel.queryDoc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName SortQuery
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class SortQuery {
@Test
public void sortQueryTest() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchSourceBuilder sourceBuilder = searchSourceBuilder.query( QueryBuilders.matchAllQuery() );
// 排序 以什么字段排序、排序方式是什么( 注意:別犯低級錯誤啊,用字符串來搞排序 )
sourceBuilder.sort("_id", SortOrder.DESC);
SearchResponse response = esClient.search( new SearchRequest()
.indices("user")
.source( searchSourceBuilder ),
RequestOptions.DEFAULT );
for (SearchHit data : response.getHits()) {
System.out.println( data.getSourceAsString() );
}
esClient.close();
}
}

3.4.7.5、條件過濾查詢
package cn.zixieqing.docHighLevel.queryDoc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName FilterQuery
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class FilterQuery {
/*
* @Author ZiXieQing
* @Description // TODO 查詢過濾
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void filterQueryTest() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 查詢結果只需要什么?
String[] includes = { "name" };
// 查詢結果不需要什么?
String[] excludes = {}; // 根據需求自行填充
searchSourceBuilder.fetchSource( includes,excludes );
SearchResponse response = esClient.search( new SearchRequest()
.indices("user")
.source( searchSourceBuilder )
, RequestOptions.DEFAULT );
for (SearchHit data : response.getHits()) {
System.out.println( data.getSourceAsString() );
}
esClient.close();
}
}
我的數據沒弄好,我建的doc中只有一個name,而老衲又懶得加了,所以:這里別讓結果把自己搞混了

3.4.7.6、組合查詢
package cn.zixieqing.docHighLevel.queryDoc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName UnionQuery
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class UnionQuery {
/*
* @Author ZiXieQing
* @Description // TODO 組合查詢至must查詢
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void mustQueryTest() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
// 注意:這里產生了改變,是調用的boolQuery()
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 必須包含什么?
boolQuery.must( QueryBuilders.matchQuery("author", "邪") );
boolQuery.must( QueryBuilders.matchQuery("sex", "girl") );
// 當然:也就有mustNot()不包含什么了
SearchResponse response = esClient.search( new SearchRequest()
.source( new SearchSourceBuilder()
.query( boolQuery ) )
, RequestOptions.DEFAULT );
for (SearchHit data : response.getHits()) {
System.out.println( data.getSourceAsString() );
}
esClient.close();
}
/*
* @Author ZiXieQing
* @Description // TODO 組合查詢之should查詢
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void shouldQueryTest() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 懶得燒蛇吃 不寫了,知道這個should和must一樣,復制粘貼多個條件即可
boolQuery.should( QueryBuilders.matchQuery("title", "是") );
SearchResponse response = esClient.search( new SearchRequest()
.source( new SearchSourceBuilder()
.query(boolQuery) )
, RequestOptions.DEFAULT );
for (SearchHit data : response.getHits()) {
System.out.println( data.getSourceAsString() );
}
esClient.close();
}
}
must查詢的結果:

should查詢的結果

3.4.7.7、范圍查詢
package cn.zixieqing.docHighLevel.queryDoc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName RangeQuery
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class RangeQuery {
/*
* @Author ZiXieQing
* @Description // TODO 范圍查詢 即:基礎篇中的filter range
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void rangeQuery() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("id");
// 對結果進行處理 gt > lt < gte >= lte <=
rangeQuery.gt("10000");
SearchResponse response = esClient.search( new SearchRequest()
.source( new SearchSourceBuilder()
.query( rangeQuery ) )
, RequestOptions.DEFAULT );
for (SearchHit data : response.getHits()) {
System.out.println( data.getSourceAsString() );
}
esClient.close();
}
}

3.4.7.8、模糊查詢
package cn.zixieqing.docHighLevel.queryDoc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.index.query.FuzzyQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName FuzzyQuery
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class FuzzyQuery {
/*
* @Author ZiXieQing
* @Description // TODO 模糊查詢
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void fuzzyQuery() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
// 模糊查詢
// fuzziness( Fuzziness.ONE ) 表示的是:字符誤差數 取值有:zero、one、two、auto
// 誤差數 指的是:fuzzyQuery("author","網二")這里面匹配的字符的誤差嘛
// 可以有幾個字符不一樣 / 多 / 少幾個字符?
FuzzyQueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("author","網二").fuzziness( Fuzziness.ONE );
SearchResponse response = esClient.search( new SearchRequest()
.source( new SearchSourceBuilder()
.query(fuzzyQuery) )
, RequestOptions.DEFAULT );
for (SearchHit data : response.getHits()) {
System.out.println( data.getSourceAsString() );
}
esClient.close();
}
}

3.4.7.9、高亮查詢
package cn.zixieqing.docHighLevel.queryDoc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermsQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName HighLightQuery
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
public class HighLightQuery {
/*
* @Author ZiXieQing
* @Description // TODO 高亮查詢 highLight
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void highLightQueryTest() throws IOException {
// 1、獲取鏈接對象
RestHighLevelClient esClient = ESClientUtil.getESClient();
// 3、創建SearchSourceBuilder對象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 4、查詢什么數據?
TermsQueryBuilder termsQuery = QueryBuilders.termsQuery("author", "小紫1");
// 5、構建高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
// 高亮編寫
highlightBuilder.preTags("<span color='blue'>"); // 構建標簽前綴
highlightBuilder.postTags("</span>"); // 構建標簽后綴
highlightBuilder.field("author"); // 構建高亮字段
// 6、設置高亮
searchSourceBuilder.highlighter( highlightBuilder );
// 7、進行查詢
searchSourceBuilder.query( termsQuery );
// 2、發送請求、獲取響應對象
SearchResponse response = esClient.search( new SearchRequest().indices("user").source( searchSourceBuilder ) , RequestOptions.DEFAULT);
// 驗證
System.out.println(response);
for (SearchHit hit : response.getHits()) {
System.out.println(hit.getSourceAsString());
System.out.println( hit.getHighlightFields());
}
// 9、關閉鏈接
esClient.close();
}
}
3.4.7.10、聚合查詢
package cn.zixieqing.docHighLevel.queryDoc;
import cn.zixieqing.utile.ESClientUtil;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import java.io.IOException;
/**
* @ClassName AggQuery
* @Author ZiXieQing
* @Date 2021/12/14
* Version 1.0
**/
// 聚合查詢
public class AggQuery {
/*
* @Author ZiXieQing
* @Description // TODO 最大值查詢
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void maxQueryTest() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// max("maxId") 這個名字是隨便取的 不講究,就是取個名字而已 聯想:有max、就有min、avg、count、sum......
// 注:方法變成term()就是分組了
// field("_id") 對哪個字段求最大值
searchSourceBuilder.aggregation( AggregationBuilders.max("maxId").field("id") );
SearchResponse response = esClient.search(new SearchRequest().source(searchSourceBuilder), RequestOptions.DEFAULT);
// 檢驗
System.out.println(response);
esClient.close();
}
/*
* @Author ZiXieQing
* @Description // TODO 分組查詢
* @Date 2021/12/14
* @Param []
* @return void
*/
@Test
public void groupQueryTest() throws IOException {
RestHighLevelClient esClient = ESClientUtil.getESClient();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 分組
searchSourceBuilder.aggregation( AggregationBuilders.terms("groupQuery").field("author") );
SearchResponse response = esClient.search( new SearchRequest().source(searchSourceBuilder), RequestOptions.DEFAULT);
System.out.println(response);
esClient.close();
}
}

