一、导入依赖
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>${elastic.client.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>${elastic.client.version}</version> </dependency>
二、获取客户端(单例)
public static synchronized RestHighLevelClient getRestClient() {
if (restClient == null) {
String[] ips = elasticIps.split(" ");
ArrayList<HttpHost> hostsArr = new ArrayList<>(ips.length);
for (String ip : ips) {
if (Strings.isNullOrEmpty(ip.trim())) {
continue;
}
HttpHost host = HttpHost.create(ip);
hostsArr.add(host);
}
RestClientBuilder builder = RestClient.builder(
hostsArr.toArray(new HttpHost[0])
).setRequestConfigCallback(
requestConfigBuilder -> requestConfigBuilder
.setAuthenticationEnabled(true)
.setConnectTimeout(60000)
.setConnectionRequestTimeout(300000)
.setSocketTimeout(300000));
if (authEnable) {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
builder.setHttpClientConfigCallback(httpClientBuilder ->
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
}
restClient = new RestHighLevelClient(builder);
}
return restClient;
}
三、创建索引和文档以及批量插入数据
(创建文档方式有点low,字段多了容易出错)
private void putData(List<BindAssetsDto> bindAssetsDtoList ){
try {
//判断索引是否已经存在
GetIndexRequest existsRequest = new GetIndexRequest();
existsRequest.indices(indexName);
boolean isExist = restClient.indices().exists(existsRequest, RequestOptions.DEFAULT);
if (!isExist){
//创建索引
Settings.Builder setting = Settings.builder().put("number_of_shards", "5").put("number_of_replicas", 1);
XContentBuilder mappings = JsonXContent.contentBuilder().
startObject().
startObject("properties").
startObject("id").
field("type", "long").
endObject().
...
endObject().
endObject();
CreateIndexRequest request = new CreateIndexRequest(indexName).settings(setting).mapping(typeName, mappings);
restClient.indices().create(request, RequestOptions.DEFAULT);
LOGGER.info("创建索引: " + indexName + " 成功!");
}
BulkRequest bulkRequest = new BulkRequest();
ObjectMapper objectMapper = new ObjectMapper();
for (BindAssetsDto bindAssetsDto : bindAssetsDtoList) {
bulkRequest.add(new IndexRequest(indexName, typeName).source(objectMapper.writeValueAsString(bindAssetsDto),XContentType.JSON));
}
restClient.bulk(bulkRequest,RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
}
四、批量删除数据
private void deleteData(List<Long> list) {
DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest();
deleteByQueryRequest.indices(indexName);
TermsQueryBuilder builder = QueryBuilders.termsQuery("field", list);
deleteByQueryRequest.setQuery(builder);
deleteByQueryRequest.setConflicts("proceed");
try {
restClient.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
}
五、查询数据,使用BoolQueryBuilder方式
QueryBuilders.wildcardQuery():通配符方式模糊查询
QueryBuilders.termQuery():完全匹配(单个值,多个值用termsQuery())
must():and条件
public String search(Dto dto) {
GetIndexRequest existsRequest = new GetIndexRequest();
existsRequest.indices(indexName);
try {
boolean isExist = restClient.indices().exists(existsRequest, RequestOptions.DEFAULT);
if (!isExist){
return null;
}
} catch (IOException e) {
e.printStackTrace();
}
SearchRequest request = new SearchRequest();
request.indices(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().trackTotalHits(true);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.wildcardQuery("path", dto.getdPath()+"*"));
if (StringUtils.isNotBlank(dto.getOrderBy())) {
searchSourceBuilder.sort(dto.getOrderBy(), SortOrder.valueOf(dto.getSort()));
}
searchSourceBuilder.from(dto.getPageNum());
searchSourceBuilder.size(dto.getPageSize());
searchSourceBuilder.query(boolQueryBuilder);
try {
SearchResponse response = restClient.search(request, RequestOptions.DEFAULT);
return response.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}