refresh与批量操作的效率

 
 

refresh操作执行的逻辑

 
    默认情况下,es每隔一秒钟执行一次refresh,可以通过参数index.refresh_interval来修改这个刷新间隔,执行refresh操作具体做了哪些事情呢?
            所有在内存缓冲区中的文档被写入到一个新的segment中,但是没有调用fsync,因此内存中的数据可能丢失
            segment被打开使得里面的文档能够被搜索到
            清空内存缓冲区
 

批量操作优化步骤

        1、关闭refresh 
        2、关闭副本
        3、批量上传数据
        4、恢复refresh
        5、强制refresh
 

关闭refresh

    refresh的操作涉及到数据转移,开销比较大。因此在批量构建索引时可以把refresh间隔设置成-1来临时关闭refresh,等到索引都提交完成之后再打开refresh,可以通过如下接口修改这个参数:
        curl -XPUT 'localhost:9200/test/_settings' -d '{
            "index" : {
                "refresh_interval" : "-1"
            }
        }'
 

关闭副本 

    另外当在做批量索引时,可以考虑把副本数设置成0,因为document从主分片(primary shard)复制到从分片(replica shard)时,从分片也要执行相同的分析、索引和合并过程,这样的开销比较大,你可以在构建索引之后再开启副本,这样只需要把数据从主分片拷贝到从分片:
        curl -XPUT 'localhost:9200/my_index/_settings' -d ' {
            "index" : {
                "number_of_replicas" : 0
            }
        }'
 

批量上传数据

   上传自己的数据即可

恢复refresh

执行完批量索引之后,把刷新间隔改回来:
        curl -XPUT 'localhost:9200/my_index/_settings' -d '{
            "index" : {
                "refresh_interval" : "1s"
            }
        }'
 

 强制refresh

你还可以强制执行一次refresh以及索引分段的合并:
        curl -XPOST 'localhost:9200/my_index/_refresh'
        curl -XPOST 'localhost:9200/my_index/_forcemerge?max_num_segments=5'
posted @ 2020-12-19 22:39  dos_hello_world  阅读(498)  评论(0)    收藏  举报