RefreshPolicy-刷新策略

es分片默认刷新频率为1s

刷新频率越高越耗资源(刷新即写入硬盘,并会产生记录),详细参考es的refresh过程

{
  "settings": {},
  "defaults": {
    "index": {
      "refresh_interval": "1s"
    }
  }
}

为保证数据实时性,es提供手动刷新方法,以Java为例

org.elasticsearch.action.support.WriteRequest.RefreshPolicy

/**
 * 默认,不刷新
 * 不消耗资源
 * 连续操作容易导致数据不同步 
 */
NONE("false"),
/**
 * 强制刷新,立即刷新数据,刷新成功后结束
 * 保证最终数据同步
 * 耗资源
 */
IMMEDIATE("true"),
/**
 * 延迟刷新数据,刷新成功后结束
 * 保证最终数据同步
 * 耗时(根据refresh_interval配置决定等待时间
 */
WAIT_UNTIL("wait_for");

在请求结束后对我们写入的索引调用刷新

Java操作es刷新案例

//### Rest方式
@Autowired
public ElasticsearchRestTemplate elasticsearchRestTemplate;

BulkOptions.BulkOptionsBuilder builder = BulkOptions.builder();
//设置刷新策略
builder.withRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
//1、批量更新
elasticsearchRestTemplate.bulkUpdate(updateQueries, builder.build(),IndexCoordinates.of("索引名称"));

//2、单条更新
elasticsearchRestTemplate.update(updateQueries, builder.build(),IndexCoordinates.of("索引名称"));

//3、通过调整更新参数配置刷新
//此方式不适用于bulk操作 (RefreshPolicy is not supported on an item request. Set it on the BulkRequest instead.;
UpdateQuery updateQuery = builder.withRefresh(UpdateQuery.Refresh.True).withDocument(document).build();


//### Client原生方式
@Autowired
private RestHighLevelClient client;

UpdateByQueryRequest request = new UpdateByQueryRequest("索引名称");
//在请求结束后对我们写入的索引调用刷新
request.setRefresh(true);
client.updateByQueryAsync(request, RequestOptions.DEFAULT,listener);

Es 语法

PUT /test/_doc/2?refresh=true
{"test": "test"}

小结

所事情的第一步,是要确定为什么做?要不要做?

然后是为什么这样做?这样做对不对?有没有更简单的方法?

第三步才是决定做

开始做的时候,一定要局部最小开始处理。避免范围影响太大。

参考资料

https://www.jianshu.com/p/76d7564ee180