Elasticsearch简单使用
1.创建索引
public boolean createIndex(String index) {
//index名必须全小写,否则报错
org.elasticsearch.client.indices.CreateIndexRequest request = new CreateIndexRequest(index);
try {
RestHighLevelClient client = elasticsearchConfig.getRestHighLevelClient();
CreateIndexResponse indexResponse = client.indices().create(request,ElasticsearchConfig.getCommonOptions());
if (indexResponse.isAcknowledged()) {
log.info("创建索引成功");
} else {
log.info("创建索引失败");
}
return indexResponse.isAcknowledged();
} catch (IOException e) {
log.info("创建索引失败");
e.printStackTrace();
}
return false;
}
2.创建文档数据(可批量)
public void createDocument() {
RestHighLevelClient client = elasticsearchConfig.getRestHighLevelClient();
BulkRequest bulkRequest = new BulkRequest();
Map<String,Object> map = new HashMap<>();
map.put("NAME","张三");
map.put("sex","男");
bulkRequest.add(new IndexRequest("search_operation_data").id(String.valueOf(1)).source(map));
try {
client.bulk(bulkRequest, RequestOptions.DEFAULT);
log.info("新增文档数据成功");
client.close();
}catch (Exception e){
log.info("新增文档数据失败:"+e);
}
System.out.println("结束");
}
3.判断指定的索引名是否存在
public boolean indexExists(String indexName) {
GetIndexRequest request = new GetIndexRequest();
request.indices(indexName);
try {
return elasticsearchConfig.getRestHighLevelClient().indices().exists(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
4.检索、分页(查询文档数据)
public List<Map<String, Object>> searchDocument(String indexName, Map<String, Object> mpParams,Integer moudelType,
int from, int size, String[] fieldArray, Integer preciseQuery) {
RestHighLevelClient restHighLevelClient = null;
SearchRequest searchRequest = new SearchRequest(indexName);
// 大多数搜索参数添加到searchSourceBuilder
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
List<Map<String, Object>> mapList = new ArrayList<>();
try {
restHighLevelClient = elasticsearchConfig.getRestHighLevelClient();
// 组合字段查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//( BUSINESS_ID = 1 or BUSINESS_ID = 2 ) and NAME = "陈"
BoolQueryBuilder boolQueryBuilderV1 = QueryBuilders.boolQuery();
BoolQueryBuilder boolQueryBuilderV2 = QueryBuilders.boolQuery();
boolQueryBuilderV1.should(QueryBuilders.matchPhraseQuery("BUSINESS_ID", "1"));
boolQueryBuilderV1.should(QueryBuilders.matchPhraseQuery("BUSINESS_ID", "11"));
boolQueryBuilderV2.should(QueryBuilders.matchPhraseQuery("NAME", "*"+mpParams.get("NAME")+"*"));
boolQueryBuilder.must(boolQueryBuilderV1);
boolQueryBuilder.must(boolQueryBuilderV2);
searchSourceBuilder.query(boolQueryBuilder);
// 按照Id倒序businessId
searchSourceBuilder.sort(new FieldSortBuilder("BUSINESS_ID").order(SortOrder.ASC));
// 分页
searchSourceBuilder.from(0);
searchSourceBuilder.size(10);
// 允许搜索的超时时长
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 返回结果
SearchHits searchHitArray = searchResponse.getHits();
for (SearchHit searchHit : searchHitArray.getHits()) {
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
mapList.add(sourceAsMap);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
restHighLevelClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return mapList;
}
5.更新文档内容
public void updateDocument(String indexName, String id) throws Exception {
RestHighLevelClient client = elasticsearchConfig.getRestHighLevelClient();
// 更新部分文档内容
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("age", 25);
jsonMap.put("email", "email2020");
// 创建更新文档请求并设置参数
UpdateRequest updateRequest = new UpdateRequest(indexName, id);
updateRequest.doc(jsonMap);
// 主分片执行更新的超时时长
updateRequest.timeout(TimeValue.timeValueSeconds(1));
// 刷新策略
updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);
// 重试更新操作多少次
updateRequest.retryOnConflict(3);
// 异步执行更新文档的请求
client.updateAsync(updateRequest, RequestOptions.DEFAULT, new ActionListener<UpdateResponse>() {
@Override
public void onResponse(UpdateResponse updateResponse) {
log.info("更新文档内容成功:"+updateResponse);
}
@Override
public void onFailure(Exception e){
log.info("更新文档内容失败:"+e.getMessage());
}
});
}
注:RestHighLevelClient 获取
public RestHighLevelClient getRestHighLevelClient() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
//访问用户名和密码为您创建阿里云Elasticsearch实例时设置的用户名和密码,也是Kibana控制台的登录用户名和密码。
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user, pwd));
// 通过builder创建rest client,配置http client的HttpClientConfigCallback。
// 单击所创建的Elasticsearch实例ID,在基本信息页面获取公网地址,即为ES集群地址。
RestClientBuilder builder = RestClient.builder(new HttpHost(address, port))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
// RestHighLevelClient实例通过REST low-level client builder进行构造。
RestHighLevelClient highClient = new RestHighLevelClient(builder);
return highClient;
}