elasticsearch7.6.2 - springboot呼叫
阿新 • • 發佈:2020-10-20
一 整合
整合程式碼放在https://gitee.com/elvinle/jd_pachong.git 中, 並不複雜
elasticsearch 官方推薦使用 rest 方式進行操作.
二 庫操作
private static String INDEX_DEFAULT = "elvin"; private static String INDEX_JD = "jd_goods"; @Autowired RestHighLevelClient client; //region 索引庫操作 //建立索引 @Test public void createIndex() throws Exception { CreateIndexRequest createReq= new CreateIndexRequest(INDEX_DEFAULT); CreateIndexResponse resp = client.indices().create(createReq, RequestOptions.DEFAULT); System.out.println(JSON.toJSONString(resp)); } //判斷索引是否存在 @Test public void existsIndex() throws Exception { GetIndexRequest createIndexReq = new GetIndexRequest(INDEX_DEFAULT);boolean exists = client.indices().exists(createIndexReq, RequestOptions.DEFAULT); System.out.println(JSON.toJSONString(exists)); } //刪除索引 @Test public void deleteIndex() throws Exception { DeleteIndexRequest deleteReq = new DeleteIndexRequest(INDEX_DEFAULT); AcknowledgedResponse resp = client.indices().delete(deleteReq, RequestOptions.DEFAULT); System.out.println(JSON.toJSONString(resp)); }//endregion
建庫一般都是提前建好的.
三 文件操作
//region 文件操作 //建立文件 @Test public void addDoc() throws Exception{ User user = User.builder() .id("1") .name("elvin") .age(29) .work("java軟體開發工程師") .hobby(new ArrayList<String>() {{ add("籃球"); add("羽毛球"); add("乒乓球"); add("游泳"); }}) .desc("一個喜歡運動, 愛老婆的boy").build(); IndexRequest req = new IndexRequest(INDEX_DEFAULT); req.id(user.getId()); req.timeout("5s"); req.source(JSON.toJSONString(user), XContentType.JSON); IndexResponse resp = client.index(req, RequestOptions.DEFAULT); System.out.println("新增文件 -> " + req.toString()); System.out.println("結果 -> " + resp.toString()); System.out.println("狀態 -> " + resp.status()); } //判斷文件是否存在 @Test public void existsDoc() throws Exception{ GetRequest req = new GetRequest(INDEX_DEFAULT, "1"); boolean exists = client.exists(req, RequestOptions.DEFAULT); System.out.println("文件是否存在 : " + exists); } //根據id獲取文件 @Test public void getDoc() throws Exception{ GetRequest req = new GetRequest(INDEX_DEFAULT, "1"); GetResponse resp = client.get(req, RequestOptions.DEFAULT); System.out.println("獲取到的文件 : " + resp.getSourceAsString()); } //修改文件 @Test public void updateDoc() throws Exception{ User user = new User(); user.setDesc("熱愛生活和熱愛工作"); UpdateRequest req = new UpdateRequest(INDEX_DEFAULT, "1"); req.id("1"); req.timeout("5s"); req.doc(JSON.toJSONString(user), XContentType.JSON); UpdateResponse resp = client.update(req, RequestOptions.DEFAULT); System.out.println("修改文件 --> " + req.toString()); System.out.println("修改結果 --> " + resp.status()); //getDoc(); } //根據id刪除文件 @Test public void deleteDoc() throws Exception{ DeleteRequest req = new DeleteRequest(INDEX_DEFAULT, "1"); DeleteResponse resp = client.delete(req, RequestOptions.DEFAULT); System.out.println("獲取到的文件 : " + resp.status()); } //批量新增 @Test public void bulkAddDoc() throws Exception{ List<User> userList = new ArrayList<>(); for (int i = 1; i < 11; i++) { User user = User.builder() .id(String.valueOf(i)) .name("elvin" + i) .age(29) .work("java軟體開發工程師") .hobby(new ArrayList<String>() {{ add("籃球"); add("羽毛球"); add("乒乓球"); add("游泳"); }}) .desc("一個喜歡運動, 愛老婆的boy") .build(); userList.add(user); } BulkRequest req = new BulkRequest(); req.timeout("5s"); for (int i = 0; i < userList.size(); i++) { req.add(new IndexRequest(INDEX_DEFAULT) .id(String.valueOf(i + 1 )) .source(JSON.toJSONString(userList.get(i)), XContentType.JSON) ); } BulkResponse resp = client.bulk(req, RequestOptions.DEFAULT); System.out.println("批量新增文件 -> " + resp.hasFailures()); } //查詢文件 @Test public void searchDoc() throws Exception{ SearchRequest req = new SearchRequest(INDEX_JD); //構建查詢條件 SearchSourceBuilder reqSourceBuilder = new SearchSourceBuilder(); //設定分頁 reqSourceBuilder.from(0); reqSourceBuilder.size(5); //設定高亮 HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("title"); highlightBuilder.preTags("<span style='color:red'>"); highlightBuilder.postTags("</span>"); reqSourceBuilder.highlighter(highlightBuilder); //term查詢 TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "java"); reqSourceBuilder.query(termQueryBuilder); reqSourceBuilder.timeout(new TimeValue(5, TimeUnit.SECONDS)); req.source(reqSourceBuilder); SearchResponse resp = client.search(req, RequestOptions.DEFAULT); System.out.println("測試查詢文件-----"+JSON.toJSONString(resp.getHits())); System.out.println("====================="); for (SearchHit documentFields : resp.getHits().getHits()) { System.out.println("測試查詢文件--遍歷引數--"+documentFields.getSourceAsMap()); } System.out.println("----------替換高亮列-----------"); //解析結果 ArrayList<Map<String, Object>> list = new ArrayList<>(); for (SearchHit hit : resp.getHits().getHits()) { //解析高亮的欄位 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); HighlightField title = highlightFields.get("title"); Map<String, Object> sourceAsMap = hit.getSourceAsMap(); //解析高亮的欄位 if(title != null){ Text[] fragments = title.fragments(); String n_title = ""; for (Text text : fragments) { n_title += text; } //將高亮的欄位替換掉原來的欄位 sourceAsMap.put("title", n_title); } list.add(sourceAsMap); } list.forEach(n-> System.out.println(JSON.toJSONString(n))); } //endregion
文件操作中, 可能查詢比較多用一點. 增刪改可以通過canal 來完成.