
在Elasticsearch 8.0的版本中也將完全移除TransportClient,其次有些es有些賬號不能通過 9300端口連接
所以項目中打算由RestHighLevelClient 替換掉 Transport Client
版本
這里給一張springboot官方的版本推薦

這里我的springboot版本為 2.1.6.RELEASE Elasticsearch 版本為 6.8.2
升級需要的maven依賴:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>3.2.6.RELEASE</version> </dependency>
只需要這一個即可
配置
application.properties
# ip+端口 elasticSearch.host.port=localhost:9200 elasticSearch.user=elastic elasticSearch.password=123456 # Socket連接超時時間 elasticSearch.socketTimeout = 60
ElasticConfig
@Configuration public class ElasticConfig extends AbstractElasticsearchConfiguration { @Value("${elasticSearch.host.port}") private String hostAndPort; @Value("${elasticSearch.user}") private String user; @Value("${elasticSearch.password}") private String password; @Value("${elasticSearch.socketTimeout}") private long socketTimeout; @Override @Bean public RestHighLevelClient elasticsearchClient() { final ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(hostAndPort) .withBasicAuth(user, password) .withSocketTimeout(Duration.ofSeconds(socketTimeout)) .build(); return RestClients.create(clientConfiguration).rest(); } /*@Bean public RestHighLevelClient esRestClient(){ RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("192.168.77.130", 9200, "http"))); return client; }*/ @Bean public ElasticsearchRestTemplate restTemplate() throws Exception { return new ElasticsearchRestTemplate(elasticsearchClient()); } }
至此環境就搭建完成了,我們來看看具體的操作
刪除索引
@Autowired ElasticsearchRestTemplate restTemplate; public boolean deleteIndex(String indexName) throws Exception{ GetIndexRequest request = new GetIndexRequest(indexName); boolean exists = restTemplate.getClient().indices().exists(request, RequestOptions.DEFAULT); if (exists) { log.info("索引存在"); DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName); AcknowledgedResponse deleteIndexResponse = restTemplate.getClient().indices() .delete(deleteIndexRequest, RequestOptions.DEFAULT); if (deleteIndexResponse.isAcknowledged()) { log.info("刪除成功"); } return true; } return true; }
創建索引
public boolean createIndex(String indexName, String mapping) throws Exception { //創建前先調用上面的刪除索引方法 deleteIndex(indexName); // 創建索引 CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName); createIndexRequest.settings(Settings.builder() .put("index.number_of_shards", 1)//指定shards .put("index.number_of_replicas", 0))//指定replicas .mapping(mapping, XContentType.JSON);//指定mapping CreateIndexResponse createIndexResponse = restTemplate.getClient().indices() .create(createIndexRequest, RequestOptions.DEFAULT); if (createIndexResponse.isAcknowledged()) { log.info("索引創建成功"); return true; } return false; }
批量插入數據
public <T> int documents(List<DscStandardProduct> list){ if (CollectionUtils.isEmpty(list)) { return 0; } DscStandardProduct t = list.get(0); Document document = t.getClass().getAnnotation(Document.class); BulkRequest request = new BulkRequest(); List<IndexQuery> queries = list.stream().map(item->{ item.getOtherSpec(); IndexQuery query = new IndexQuery(); query.setIndexName(document.indexName()); query.setType(document.type()); query.setSource(JSON.toJSONString(item)); return query; }).collect(Collectors.toList()); restTemplate.bulkIndex(queries); return list.size(); }
這里給出類 DscStandardProduct的注解信息

簡單的查詢
基本還是和原來 ElasticsearchTemplate 類似
public void query(){ Drug drug = new Drug(name, company, approval, spec); SearchQuery query = getQuery(drug, true); PageRequest request = PageRequest.of(0,1); query.setPageable(request); List<DscStandardProduct> list = restTemplate.queryForList(query, DscStandardProduct.class); } private SearchQuery getQuery(Drug drug, Boolean specFlag) { BoolQueryBuilder builder = QueryBuilders.boolQuery(); BoolQueryBuilder nameMatch = QueryBuilders.boolQuery().minimumShouldMatch(1) .should(QueryBuilders.matchQuery("drugName",drug.getName())) .should(QueryBuilders.matchQuery("productName",drug.getName())); BoolQueryBuilder must = QueryBuilders.boolQuery().minimumShouldMatch(2) .should(nameMatch) .should(QueryBuilders.matchQuery("company", drug.getCompany())) .should(QueryBuilders.matchQuery("approvalIndex", drug.getApproval())); builder.must(must); if (specFlag) { BoolQueryBuilder specMatch = QueryBuilders.boolQuery().minimumShouldMatch(1) .should(QueryBuilders.matchQuery("specIndex",drug.getSpec())) .should(QueryBuilders.matchQuery("otherSpec",drug.getSpec())); builder.must(specMatch); builder.should(QueryBuilders.termQuery("specIndex.full", drug.getSpec())) .should(QueryBuilders.termQuery("otherSpec.full", drug.getSpec())); } return new NativeSearchQuery(builder); }
更多
更多操作請參考
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#preface.versions
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/java-rest-high-search.html
