pom.xml配置
org.elasticsearch.client
elasticsearch-rest-high-level-client
7.8.0
elasticsearch
org.elasticsearch
elasticsearch-rest-client
org.elasticsearch.client
org.springframework.boot
spring-boot-starter-data-elasticsearch
2.3.9.RELEASE
org.elasticsearch.client
elasticsearch-rest-client
7.8.0
org.elasticsearch
elasticsearch
7.8.0
org.elasticsearch.plugin
transport-netty4-client
7.8.0
org.elasticsearch.client
transport
7.8.0
yml配置
elasticsearch:
hosts: ${ES_HOST:ip:端口}
es_user_name: ${ES_USER_NAME:xxxx}
es_password: ${ES_PASSWORD:xxxxx}
EsConfig配置
@Configuration
@Slf4j
public class EsConfig {
@Value("${es_user_name}")
private String username;
@Value("${es_password}")
private String password;
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder=RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS=builder.build();
}
@Bean
RestHighLevelClient restHighLevelClient(@Value("${spring.elasticsearch.hosts}") String hosts) {
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username,password));
String[] hostsWithPort = hosts.split(",");
HttpHost[] httpHosts = new HttpHost[hostsWithPort.length];
for (int i = 0; i < hostsWithPort.length; i++) {
String hostWithPort = hostsWithPort[i];
String[] hostPort = hostWithPort.split(":");
String host = hostPort[0];
String port = hostPort[1];
httpHosts[i] = new HttpHost(host, Integer.parseInt(port));
}
return new RestHighLevelClient(RestClient.builder(httpHosts).setHttpClientConfigCallback(f->f.setDefaultCredentialsProvider(credentialsProvider)));
}
}
ElasticSearchConfig 配置
@Configuration
public class ElasticSearchConfig {
/**
* 防止netty的bug
* java.lang.IllegalStateException: availableProcessors is already set to [4], rejecting [4]
*/
@PostConstruct
void init() {
System.setProperty("es.set.netty.runtime.available.processors", "false");
}
}
启动类配置
public static void main(String[] args) {
System.setProperty("es.set.netty.runtime.available.processors", "false");
SpringApplication.run(xxxx.class, args);
}
//批量操作的对象
private BulkProcessor bulkProcessor=createBulkProcessor();
@Autowired
RestHighLevelClient restHighLevelClient;
private BulkProcessor createBulkProcessor() {
BulkProcessor.Listener listener = new BulkProcessor.Listener() {
@Override
public void beforeBulk(long executionId, BulkRequest request) {
log.info("1. 【beforeBulk】批次[{}] 携带 {} 请求数量", executionId, request.numberOfActions());
}
@Override
public void afterBulk(long executionId, BulkRequest request,
BulkResponse response) {
if (!response.hasFailures()) {
log.info("2. 【afterBulk-成功】批量 [{}] 完成在 {} ms", executionId, response.getTook().getMillis());
} else {
BulkItemResponse[] items = response.getItems();
for (BulkItemResponse item : items) {
if (item.isFailed()) {
log.info("2. 【afterBulk-失败】批量 [{}] 出现异常的原因 : {}", executionId, item.getFailureMessage());
break;
}
}
}
}
@Override
public void afterBulk(long executionId, BulkRequest request,
Throwable failure) {
List> requests = request.requests();
List esIds = requests.stream().map(DocWriteRequest::id).collect(Collectors.toList());
log.error("3. 【afterBulk-failure失败】es执行bluk失败,失败的esId为:{}", esIds, failure);
}
};
BulkProcessor.Builder builder = BulkProcessor.builder(((bulkRequest, bulkResponseActionListener) -> {
restHighLevelClient.bulkAsync(bulkRequest, RequestOptions.DEFAULT, bulkResponseActionListener);
}), listener);
//到达10000条时刷新
builder.setBulkActions(10000);
//内存到达8M时刷新
builder.setBulkSize(new ByteSizeValue(8L, ByteSizeUnit.MB));
//设置的刷新间隔10s
builder.setFlushInterval(TimeValue.timeValueSeconds(10));
//设置允许执行的并发请求数。
builder.setConcurrentRequests(8);
//设置重试策略
builder.setBackoffPolicy(BackoffPolicy.constantBackoff(TimeValue.timeValueSeconds(1), 3));
return builder.build();
}
批量修改
public void bulkUpdate(EsUpdateBO esUpdateBO){
List updateRequests=new ArrayList<>();
esUpdateBO.getIds().forEach(e->{
//获取id
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index("es索引名称");
//更新的id
updateRequest.id(e);
//更新的数据
Map map=new HashMap<>();
map.put(esUpdateBO.getIsWarning(),"1");
updateRequest.doc(map);
updateRequests.add(updateRequest);
});
updateRequests.forEach(bulkProcessor::add);
}
批量新增
public void bulkAdd(List
根据es内部id批量查询数据
public List