本次操作是在 Windows上安装ElasticSearch7 进行操作
导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Java High Level REST Client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.4.3</version>
</dependency>
<!-- commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
<!-- Swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
application.yml
server: port: 8833 spring: application: name: elastic_search #es http方式 elasticsearch: address: localhost:9200 # username: admin # password: admin
es配置加载
package com.es.demo.config; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Arrays; import java.util.Objects; /** * es RestHighLevelClient 配置 * es 7.x之后 只支持http * @author qjc * @date 2019-07-19 10:33 */ @Configuration @Slf4j public class ESConfig { private static final int ADDRESS_LENGTH = 2; private static final String HTTP_SCHEME = "http"; //权限验证 final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); /** * 使用冒号隔开ip和端口 */ @Value("${elasticsearch.address}") private String[] address; // @Value("${elasticsearch.username}") // private String username; // @Value("${elasticsearch.password}") // private String password; @Bean public RestClientBuilder restClientBuilder() { HttpHost[] hosts = Arrays.stream(address) .map(this::makeHttpHost) .filter(Objects::nonNull) .toArray(HttpHost[]::new); log.debug("hosts:{}", Arrays.toString(hosts)); //配置权限验证 // credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); RestClientBuilder restClientBuilder = RestClient.builder(hosts).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() { @Override public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) { return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); } }); return restClientBuilder; } @Bean(name = "highLevelClient") public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) { restClientBuilder.setMaxRetryTimeoutMillis(60000); return new RestHighLevelClient(restClientBuilder); } /** * 处理请求地址 * @param s * @return HttpHost */ 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]); return new HttpHost(ip, port, HTTP_SCHEME); } else { return null; } } }
swagger
package com.es.demo.swagger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.async.DeferredResult; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration // 启动时就要加载 @EnableSwagger2 public class SwaggerConfig { private String version; @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .genericModelSubstitutes(DeferredResult.class) .select() .paths(PathSelectors.any()) .build().apiInfo(apiInfo());//.globalOperationParameters(pars); } private ApiInfo apiInfo() { return new ApiInfoBuilder().title("Earth server") .description("****") .termsOfServiceUrl("http://www.baidu.com") .version("1.0").build(); } }
插入的实体:
package com.es.demo.vo; import lombok.Data; /** * @Description: * @Param: * @Return: * @Author: qjc * @Date: 2019/10/18 */ @Data //IDEA需要安装lombok:https://www.cnblogs.com/java-spring/p/9797560.html public class User { private String name; private int age; private Double money; private String address; private String birthday; }
响应实体
package com.es.demo.vo; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class ResponseBean { //状态码 private Integer code; //返回信息 private String message; //返回的数据 private Object data; }
es操作
package com.es.demo.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.es.demo.vo.ResponseBean; import com.es.demo.vo.User; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.elasticsearch.action.DocWriteResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.support.replication.ReplicationResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.io.IOException; import java.util.concurrent.TimeUnit; /** * @Author: qjc * @Date: 2019/09/18 */ @Api(value = "ES测试接口", tags = {"ES测试接口"}) @RestController @RequestMapping("/es") @CrossOrigin(origins = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE, RequestMethod.PUT}) @Slf4j public class ESTestController { @Resource private RestHighLevelClient highLevelClient; @ApiOperation(value = "es测试插入接口", notes = "es测试插入接口") @RequestMapping(value = "/insert", method = RequestMethod.GET) public ResponseBean findIndustryClassList(@RequestParam String name, @RequestParam Integer age, @RequestParam String address, @RequestParam String birthday) { String indexName = "test_es"; IndexRequest indexRequest = new IndexRequest(indexName, "user"); User user = new User(); user.setName(name); user.setAge(age); user.setAddress(address); user.setBirthday(birthday); String userJson = JSONObject.toJSONString(user); indexRequest.source(userJson, XContentType.JSON); try { IndexResponse indexResponse = highLevelClient.index(indexRequest, RequestOptions.DEFAULT); if (indexResponse != null) { String id = indexResponse.getId(); String index = indexResponse.getIndex(); String type = indexResponse.getType(); long version = indexResponse.getVersion(); log.info("index:{},type:{},id:{}", index, type, id); if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) { System.out.println("新增文档成功!" + index + "-" + type + "-" + id + "-" + version); return new ResponseBean(200, "插入成功", null); } else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) { System.out.println("修改文档成功!"); return new ResponseBean(10001, "插入失败", null); } // 分片处理信息 ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo(); if (shardInfo.getTotal() != shardInfo.getSuccessful()) { System.out.println("分片处理信息....."); } // 如果有分片副本失败,可以获得失败原因信息 if (shardInfo.getFailed() > 0) { for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures()) { String reason = failure.reason(); System.out.println("副本失败原因:" + reason); } } } } catch (IOException e) { e.printStackTrace(); } return null; } @ApiOperation(value = "es测试查询接口", notes = "es测试查询接口") @RequestMapping(value = "/query", method = RequestMethod.GET) public ResponseBean testESFind(@RequestParam String name) { SearchRequest searchRequest = new SearchRequest("test_es"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.termQuery("name.keyword", name)); sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); searchRequest.source(sourceBuilder); try { SearchResponse response = highLevelClient.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); JSONArray jsonArray = new JSONArray(); for (SearchHit hit : hits) { String sourceAsString = hit.getSourceAsString(); JSONObject jsonObject = JSON.parseObject(sourceAsString); jsonArray.add(jsonObject); } return new ResponseBean(200, "查询成功", jsonArray); } catch (IOException e) { e.printStackTrace(); return new ResponseBean(10001, "查询失败", null); } } }