一、導入依賴json
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.6.2</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.6.2</version> </dependency>
二、配置application.xmlapp
elasticsearch: ip: 你的ip:9200
三、建立配置類elasticsearch
/** * 描述: 鏈接客戶端 * * @author wenye * @create 2021-03-25 13:22 */ @Configuration public class ElasticSearchClientConfig { /** * 超時時間設爲5分鐘 */ private static final int TIME_OUT = 5 * 60 * 1000; private static final int ADDRESS_LENGTH = 2; private static final String HTTP_SCHEME = "http"; @Value("${elasticsearch.ip}") String[] ipAddress; @Bean public RestClientBuilder restClientBuilder() { HttpHost[] hosts = Arrays.stream(ipAddress) .map(this::makeHttpHost) .filter(Objects::nonNull) .toArray(HttpHost[]::new); return RestClient.builder(hosts); } @Bean(name = "highLevelClient") public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) { restClientBuilder.setRequestConfigCallback( new RestClientBuilder.RequestConfigCallback() { @Override public RequestConfig.Builder customizeRequestConfig( RequestConfig.Builder requestConfigBuilder) { return requestConfigBuilder.setSocketTimeout(TIME_OUT); } }); //TODO 此處能夠進行其它操做 return new RestHighLevelClient(restClientBuilder); } private HttpHost makeHttpHost(String s) { assert StringUtils.isNotEmpty(s); String[] address = s.split(":"); if (address.length == ADDRESS_LENGTH) { String ip = address[0]; int port = Integer.parseInt(address[1]); System.err.println(ip+"+"+port); return new HttpHost(ip, port, HTTP_SCHEME); } else { return null; } } }
四、實現es中的一些操做、如索引的建立、文檔的crud、批量操做、各類查詢ide
/** * @author : wenye * @describe 一、jest 以及elasticSearchTemplate(這個不清楚)都被不能調用7.0的版本了年輕人耗子尾汁 7.X使用的是rest來進行通訊 * @date : 2021-02-26 19:16 **/ @RestController @RequestMapping("/elasticsearch") @Api(tags = "es文檔") public class ElasticSearch { @Autowired RestHighLevelClient restHighLevelClient; /** * 建立索引 * @throws IOException */ @RequestMapping(value = "createindex",method = RequestMethod.POST) @ApiOperation(value = "建立索引") public void createIndex() throws IOException { CreateIndexRequest request = new CreateIndexRequest("test2021030411"); restHighLevelClient.indices().create(request, RequestOptions.DEFAULT); } /** * 測試索引是否存在 */ @RequestMapping(value = "hashindex",method = RequestMethod.POST) @ApiOperation(value = "測試索引") public void testExistIndex() throws IOException { GetIndexRequest request = new GetIndexRequest("test2021030411"); //測試test_index1索引是否存在 boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT); System.out.println("索引是否存在:"+exists); } /** * 刪除索引 */ @RequestMapping(value = "deleteindex",method = RequestMethod.POST) @ApiOperation(value = "刪除索引") public void testDeleteIndex() throws IOException { DeleteIndexRequest request = new DeleteIndexRequest("test2021030411"); AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT); System.out.println(delete.isAcknowledged()); } /** * 添加文檔 */ @RequestMapping(value = "adddoc",method = RequestMethod.POST) @ApiOperation(value = "添加文檔") public void testAddDocument() throws IOException { //建立對象 ElasticsearchDto elasticSearch = new ElasticsearchDto(); elasticSearch.setAge(11); elasticSearch.setName("wenye"); //json數據 String value = JSONUtils.toJsonString(elasticSearch); //建立請求 IndexRequest request = new IndexRequest("test2021030411"); // put /test2021030411/_doc/1 request.id("1"); //設置超時時間 等待主片的響應時間 request.timeout(TimeValue.timeValueSeconds(5)); //刷新策略 request.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL); request.setRefreshPolicy("wait_for"); //將數據放入請求 request.source(value, XContentType.JSON); //執行請求 IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT); System.out.println(response.toString()); } /** * * 判斷文檔是否存在 */ @RequestMapping(value = "testexistDoc",method = RequestMethod.POST) @ApiOperation(value = "判斷文檔") public void testExistDoc() throws IOException { GetRequest request = new GetRequest("test2021030411", "1"); //不獲取返回的_source的上下文了 //request.fetchSourceContext(new FetchSourceContext(false)); //request.storedFields("_none_"); boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT); System.out.println("文檔是否存在:"+exists); } /** * 獲取文檔 * @throws IOException */ @RequestMapping(value = "getdoc",method = RequestMethod.POST) @ApiOperation(value = "獲取文檔") public RespMessage getDoc() throws IOException { GetRequest request = new GetRequest("test2021030411", "1"); GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT); System.out.println(response.getSourceAsString()); System.out.println(response); return RespHandler.success(response.getSourceAsString()); } /** * 更新文檔 */ @RequestMapping(value = "updatedoc",method = RequestMethod.POST) @ApiOperation(value = "更新文檔") void testUpdateDoc() throws IOException { ElasticsearchDto elasticSearch = new ElasticsearchDto(); elasticSearch.setAge(11); elasticSearch.setName("wenye"); UpdateRequest request = new UpdateRequest("test2021030411", "1"); //超時時間 //request.timeout("5s"); String value = JSONUtils.toJsonString(elasticSearch); request.doc(value,XContentType.JSON); UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT); } /** * 刪除文檔 */ @RequestMapping(value = "deletedoc",method = RequestMethod.POST) @ApiOperation(value = "刪除文檔") void deleteDoc() throws IOException { DeleteRequest request = new DeleteRequest("test2021030411","1"); restHighLevelClient.delete(request,RequestOptions.DEFAULT); } /** * 批量操做 * @return */ @RequestMapping(value = "bullkdoc",method = RequestMethod.POST) @ApiOperation(value = "文檔批量操做") public RespMessage bullkdoc() { BulkRequest request = new BulkRequest(); request.add(new DeleteRequest("test2021030411", "3")); request.add(new UpdateRequest("test2021030411", "2") .doc(XContentType.JSON,"other", "test")); request.add(new IndexRequest("test2021030411").id("4") .source(XContentType.JSON,"field", "baz")); try { restHighLevelClient.bulk(request,RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } return RespHandler.success(); } void simpleSearch() throws IOException { } /** * matchAll搜索 */ @RequestMapping(value = "matchallquery",method = RequestMethod.POST) @ApiOperation(value = "匹配全部") public RespMessage matchAllquery() throws IOException { SearchRequest request = new SearchRequest("test2021030411"); //構建搜索條件 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //查詢條件 能夠使用QueryBuilders工具來實現 //QueryBuilders.termQuery精確匹配 MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery(); sourceBuilder.query(matchAllQueryBuilder); sourceBuilder.timeout(new TimeValue(20, TimeUnit.SECONDS)); sourceBuilder.from(0); //查詢結果從第幾條數據開始返回 sourceBuilder.size(5);//一次返回幾條數據 request.source(sourceBuilder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); //遍歷輸出 for (SearchHit fields : response.getHits().getHits()) { System.out.println(fields.getSourceAsString()); } return RespHandler.success(response.getHits()); } /** * match搜索 */ @RequestMapping(value = "scrollquery",method = RequestMethod.POST) @ApiOperation(value = "匹配搜索") public RespMessage scrollquery() throws IOException { SearchRequest request = new SearchRequest("test2021030411"); //構建搜索條件 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //查詢條件 能夠使用QueryBuilders工具來實現 //QueryBuilders.termQuery精確匹配 MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "文燁"); sourceBuilder.query(matchQueryBuilder); sourceBuilder.timeout(new TimeValue(20, TimeUnit.SECONDS)); sourceBuilder.from(0); //查詢結果從第幾條數據開始返回 sourceBuilder.size(5);//一次返回幾條數據 //高亮搜索 HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("title"); highlightBuilder.requireFieldMatch(false); highlightBuilder.preTags("<span style='color:red'"); highlightBuilder.postTags("</span>"); sourceBuilder.highlighter(highlightBuilder); //執行查詢 request.source(sourceBuilder); //滾動設置 request.scroll(TimeValue.timeValueMinutes(1L)); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); String scrollId = response.getScrollId(); SearchHits hits = response.getHits(); //解析結果 for (SearchHit hit : response.getHits().getHits()) { //執行搜索後,取出高亮字段 Map<String, HighlightField> highlightFieldMap = hit.getHighlightFields(); HighlightField title = highlightFieldMap.get("title"); Map<String, Object> stringObjectMap = hit.getSourceAsMap();//原來的結果 //解析高亮字段 if (title != null) { //取出高亮查詢中具體的高亮字段 Text[] fra = title.fragments(); String new_title = ""; for (Text text:fra) { new_title += text; } stringObjectMap.put("title",new_title); } } return RespHandler.success(hits); // return RespHandler.success(scrollId); } /** * match搜索, scroll配置 */ @RequestMapping(value = "msearch",method = RequestMethod.POST) @ApiOperation(value = "滾動搜索") public RespMessage msearch() throws IOException { MultiSearchRequest multiSearchRequest = new MultiSearchRequest(); SearchRequest request = new SearchRequest("test2021030411"); //構建搜索條件 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //QueryBuilders.termQuery精確匹配 MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "文燁"); ///設置高亮 sourceBuilder.highlighter(); sourceBuilder.query(matchQueryBuilder); sourceBuilder.timeout(new TimeValue(20, TimeUnit.SECONDS)); request.source(sourceBuilder); multiSearchRequest.add(request); SearchRequest request2 = new SearchRequest("test2021030411"); //構建搜索條件 SearchSourceBuilder sourceBuilder2 = new SearchSourceBuilder(); //QueryBuilders.termQuery精確匹配 MatchQueryBuilder matchQueryBuilder2 = QueryBuilders.matchQuery("name", "文燁"); sourceBuilder.query(matchQueryBuilder); sourceBuilder.timeout(new TimeValue(20, TimeUnit.SECONDS)); request2.source(sourceBuilder2); multiSearchRequest.add(request2); //滾動設置 MultiSearchResponse msearch = restHighLevelClient.msearch(multiSearchRequest, RequestOptions.DEFAULT); MultiSearchResponse.Item[] responses = msearch.getResponses(); return RespHandler.success(responses); // return RespHandler.success(scrollId); } /** * term搜索 */ @RequestMapping(value = "termquery",method = RequestMethod.POST) @ApiOperation(value = "精準查詢") void termSearch() throws IOException { SearchRequest request = new SearchRequest("test2021030411"); //構建搜索條件 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //查詢條件 能夠使用QueryBuilders工具來實現 //QueryBuilders.termQuery精確匹配 TermQueryBuilder queryBuilder = QueryBuilders.termQuery("name", "user1"); sourceBuilder.query(queryBuilder); sourceBuilder.timeout(new TimeValue(20, TimeUnit.SECONDS)); sourceBuilder.from(0); //查詢結果從第幾條數據開始返回 sourceBuilder.size(5);//一次返回幾條數據 request.source(sourceBuilder); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); //遍歷輸出 for (SearchHit fields : response.getHits().getHits()) { System.out.println(fields.getSourceAsString()); } } }