導包
<!-- fastjson 對象和json轉換 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> <!--es 高級版本操作坐標--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.8.3</version> </dependency> <!--es依賴--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.8.3</version> </dependency>
先准備一份數據庫和表
PUT /root02 { "mappings": { "product": { "properties": { "id": { "type": "keyword" }, "title": { "type": "text", "analyzer": "ik_max_word" }, "category": { "type": "keyword" }, "brand": { "type": "keyword" }, "images": { "type": "keyword", "index": false }, "price": { "type": "double" } } } } }
創建一個對應的實體類
@Data @AllArgsConstructor @NoArgsConstructor public class Product { private Long id; /** * 標題 */ private String title; /** * 分類 */ private String category; /** * 品牌 */ private String brand; /** * 價格 */ private Double price; /** * 圖片地址 */ private String images; }
這里的案例使用測試類進行
1.增刪改和簡單查
API
java連接至es
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("x.x.x.x", 9200, "http")));
增刪改和簡單查
//新增 IndexRequest indexRequest = new IndexRequest("root02", "product", "1"); //根據id查詢 GetRequest getRequest = new GetRequest("root02", "product", "1"); //修改數據 final UpdateRequest updateRequest = new UpdateRequest("root02", "product", "1"); //刪除根據id DeleteRequest deleteRequest = new DeleteRequest("root02", "product", "1"); //批量添加 BulkRequest bulkRequest = new BulkRequest();
使用
public class TestClass { RestHighLevelClient client; @BeforeEach public void before() { client = new RestHighLevelClient( RestClient.builder( new HttpHost("62.234.118.219", 9902, "http"))); } /* 文檔新增 */ @Test public void add() throws IOException { //1.創建請求對象 /* 第一個參數: 索引庫名稱 第二個參數: 類型名稱 第三個參數: 可選項,id */ IndexRequest indexRequest = new IndexRequest("root02", "product", "1"); //2.准備數據---》json Product product = new Product(1L, "小米手機", "手機", "小米", 2699.00, "http://www.baidu.com"); String jsonString = JSON.toJSONString(product); //3.將數據封裝到請求對象 indexRequest.source(jsonString, XContentType.JSON); //4.發送請求 IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT); //5.打印結果 System.out.println("結果: " + indexResponse); } /* 根據id查詢文檔 */ @Test public void getById() throws IOException { //1.創建查詢對象並且設置查詢id GetRequest getRequest = new GetRequest("root02", "product", "1"); //2.發送請求 final GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT); System.out.println(documentFields); } /* 修改文檔 */ @Test public void updateDocById() throws IOException { final UpdateRequest updateRequest = new UpdateRequest("root02", "product", "1"); //2.組裝修改內容---》json Product product = new Product(1L, "大米手機", "手機", "大米", 19999.00, "http://www.baidu.com"); String jsonString = JSON.toJSONString(product); //3.將修改內容封裝到修改對象 updateRequest.doc(jsonString, XContentType.JSON); final UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT); System.out.println(update); } //刪除文檔 @Test public void delById() throws IOException { //1.創建刪除對象 DeleteRequest deleteRequest = new DeleteRequest("root02", "product", "1"); //2.發送請求 DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT); System.out.println("結果: " + deleteResponse); } /* 批量新增 */ @Test public void batchAddDoc() throws IOException { //1.創建批量請求對象 BulkRequest bulkRequest = new BulkRequest(); //2.for循環創建對象----》IndexRequest---》json for (long i = 2; i < 10; i++) { IndexRequest indexRequest = new IndexRequest("root02", "product", i + ""); //2.准備數據---》json Product product = new Product(i, "小米手機" + i, "手機", "小米", 2699.00 + i, "http://www.baidu.com"); String jsonString = JSON.toJSONString(product); //3.將數據封裝到請求對象 indexRequest.source(jsonString, XContentType.JSON); //4.將IndexRequest封裝到批量請求對象 bulkRequest.add(indexRequest); } //4.發送請求 BulkResponse bulkResponse = null; bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT); System.out.println("結果: " + bulkResponse); } @AfterEach public void close() throws IOException { client.close(); } }
2.復雜查詢
//創建searchRequest請求對象
RestHighLevelClient client;
//創建searchRequest請求對象
SearchRequest searchRequest = new SearchRequest("root02");
//創建searchSourceBuilder對象--》封裝查詢對象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
核心對象
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
//封裝了各種查詢方法
對象關系
SearchRequest -->封裝 SearchSourceBuilder -->封裝 QueryBuilder
RestHighLevelClient --> 攜帶封裝好的 SearchRequest 發送請求
使用
public class Test02 { RestHighLevelClient client; //1.創建searchRequest請求對象 SearchRequest searchRequest = new SearchRequest("root02"); //2.創建searchSourceBuilder對象-->封裝查詢對象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); @BeforeEach public void before() { client = new RestHighLevelClient( RestClient.builder( new HttpHost("62.234.118.219", 9902, "http"))); } /* 查詢所有 */ @Test public void matchAll() throws IOException { //創建查詢對象QueryBuilder QueryBuilder queryBuilder = QueryBuilders.matchAllQuery(); //封裝查詢對象 searchSourceBuilder.query(queryBuilder); //searchSourceBuilder封裝到searchRequest對象中 searchRequest.source(searchSourceBuilder); showContext(); } /* 模糊匹配查詢 */ @Test public void matchDoc() throws IOException { //3.創建查詢對象 QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "小米"); searchSourceBuilder.query(queryBuilder); searchRequest.source(searchSourceBuilder); //發送請求 showContext(); } /* 精確查詢,一般用於查詢不分詞字段 */ @Test public void term() throws IOException { QueryBuilder queryBuilder = QueryBuilders.termQuery("price", 2706); searchSourceBuilder.query(queryBuilder); searchRequest.source(searchSourceBuilder); showContext(); } //排序,高亮,分頁查詢 @Test public void commons() throws IOException { QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "小米"); searchSourceBuilder.query(queryBuilder); /* 排序 //默認升序排序 分頁: size: 頁大小 from: 起始索引位置 int start = (pagenum -1) * pagesize_ 高亮:設置條件 前置標簽: 后置標簽: 高亮字段: */ HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.preTags("<span color='red'>"); highlightBuilder.postTags("</span>"); highlightBuilder.field("title"); searchSourceBuilder.sort("price", SortOrder.ASC).from(4).size(2).highlighter(highlightBuilder); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); //7.解析結果 SearchHits searchHits = searchResponse.getHits(); if (null != searchHits) { SearchHit[] hits = searchHits.getHits(); for (SearchHit hit : hits) { String sourceAsString = hit.getSourceAsString(); System.out.println("查詢結果:" + sourceAsString); /* 高亮結果解析 */ Map<String, HighlightField> highlightFields = hit.getHighlightFields(); if (!highlightFields.isEmpty()) { Text title = highlightFields.get("title").getFragments()[0]; System.out.println("高亮結果: " + title); } } } } //封裝請求和打印數據 public void showContext() throws IOException { //發送請求 SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); //解析結果 SearchHits searchHits = searchResponse.getHits(); if (null != searchHits) { SearchHit[] hits = searchHits.getHits(); for (SearchHit hit : hits) { String sourceAsString = hit.getSourceAsString(); System.out.println("查詢結果:" + sourceAsString); } } } @AfterEach public void close() throws IOException { client.close(); } }