使用ES官方自带的java客户端(Java High Level REST Client)进行操做,不使用spring data 封装好的模板。
由于没有人比ES官方更了解本身的产品html
<!--Elastic Search 客户端 start--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.6.2</version> </dependency> <!--若是elasticsearch-rest-high-level-client包中依赖的elasticsearch等版本不一致,须要手动引入相同版本--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.6.2</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>7.6.2</version> </dependency> <!--Elastic Search 客户端 end-->
elasticsearch: hostList: localhost:9200 #多个节点用逗号隔开
@Component @PropertySource("classpath:application.yml")//配置文件地址,能够自定义 @ConfigurationProperties("elasticsearch")//属性前缀 public class ElasticSearchConfig { // @Value("${elasticsearch.hostList}") private String hostList;//配置文件中的属性 public String getHostList() { return hostList; } public void setHostList(String hostList) { this.hostList = hostList; } @Bean(value = "RestHighLevelClient", destroyMethod = "close") public RestHighLevelClient restHighLevelClient() { //经过逗号分割节点 String[] split = hostList.split(","); HttpHost[] httpHosts = new HttpHost[split.length]; for (int i = 0; i < split.length; i++) { //经过冒号分离出每个节点的ip,port String[] split1 = split[i].split(":"); //这里http写固定了,只为测试使用,能够经过读取配置文件赋值的方式优化 httpHosts[i] = new HttpHost(split1[0], Integer.parseInt(split1[1]), "http"); } return new RestHighLevelClient(RestClient.builder(httpHosts)); } }
@SpringBootTest public class ElasticTest { @Autowired @Qualifier("RestHighLevelClient") private RestHighLevelClient client; /** * 添加数据 * @throws IOException */ @Test public void index() throws IOException { UserTest userTest = new UserTest(); userTest.setName("董28"); userTest.setSex("男"); //因为客户端不支持自定义实体对象类做为添加数据的参数,因此提早先将对象转化为Map对象 Map map = entityToMap(userTest); System.out.println(map); IndexRequest indexRequest = new IndexRequest("posts") .source(map); //异步 client.indexAsync(indexRequest, RequestOptions.DEFAULT, new ActionListener<IndexResponse>() { @Override public void onResponse(IndexResponse indexResponse) { System.out.println(indexResponse); if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) { //新建 } else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) { //修改 } ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo(); if (shardInfo.getTotal() != shardInfo.getSuccessful()) { // } if (shardInfo.getFailed() > 0) { for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures()) { String reason = failure.reason(); } } } @Override public void onFailure(Exception e) { System.out.println("exception..."); } }); //同步 /*IndexRequest indexRequest = new IndexRequest("posts") .id("3").source(map); IndexResponse index = client.index(indexRequest, RequestOptions.DEFAULT); System.out.println(index);*/ } /** * 经过索引index,id查询 * */ @Test public void get() throws IOException { GetRequest getRequest = new GetRequest("posts", "1"); /*FetchSourceContext fetchSourceContext = new FetchSourceContext(true, new String[]{"sex"}, Strings.EMPTY_ARRAY); getRequest.fetchSourceContext(fetchSourceContext)*/ GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT); if (getResponse.isExists()) { System.out.println(getResponse); System.out.println(getResponse.getId()); System.out.println(getResponse.getSource()); System.out.println(getResponse.getSourceAsMap()); UserTest userTest1 = entityConvert(getResponse.getSourceAsString(), UserTest.class); System.out.println(userTest1); UserTest userTest2 = entityConvert(getResponse.getSource(), UserTest.class); System.out.println(userTest2); } } @Test public void update() throws IOException { UpdateRequest updateRequest = new UpdateRequest("posts", "8"); updateRequest.doc("sex", "女"); UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT); System.out.println(update); } @Test public void delete() throws IOException { DeleteRequest deleteRequest = new DeleteRequest("posts"); DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT); } /** * 经过字段值查询 * @throws IOException */ @Test public void search() throws IOException { SearchRequest searchRequest = new SearchRequest("posts"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //经过匹配某一字段查询 // searchSourceBuilder.query(QueryBuilders.termQuery("name","董")); //选出指定结果字段 searchSourceBuilder.fetchSource(new String[]{"id"},Strings.EMPTY_ARRAY); //对结果排序 // searchSourceBuilder.sort(new FieldSortBuilder("id").order(SortOrder.DESC)); //汇集结果 searchSourceBuilder.aggregation( AggregationBuilders .max("maxValue")//命名 .field("id"));//指定汇集的字段 //查询全部 // searchSourceBuilder.query(QueryBuilders.matchAllQuery()); //从0开始 // searchSourceBuilder.from(2).size(2); searchRequest.source(searchSourceBuilder); SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT); System.out.println(search); } @Data @AllArgsConstructor @NoArgsConstructor private static class UserTest { private int id; private String name; private String sex; private Others others = new Others("132@qq.com", "199"); } @Data @AllArgsConstructor private static class Others { private String email; private String phone; } /** * 实体对象转化为map * @param object * @return * @throws JsonProcessingException */ static Map entityToMap(Object object) throws JsonProcessingException { Map map = entityConvert(object, HashMap.class); return map; } /** * 一个对象转化为另外一个有相同属性的对象 * @param object * @param clazz * @param <T> * @return * @throws JsonProcessingException */ static <T> T entityConvert(Object object, Class<T> clazz) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); String s; if (object instanceof String) { s = String.valueOf(object); } else { s = objectMapper.writeValueAsString(object); } T t = objectMapper.readValue(s, clazz); return t; } }