elasticsearch 心得

1.es 一台机器一般为一个节点。一台机器不设置的情况下是无法创建副本集的,副本集和主本必须不在一个节点下,方便故障转移等

2.es7.x后一个索引后只能创建一个类型,可以通过修改更改

出现这个的原因是,elasticsearch7默认不在支持指定索引类型,默认索引类型是_doc,如果想改变,则配置include_type_name: true 即可(这个没有测试,官方文档说的,无论是否可行,建议不要这么做,因为elasticsearch8后就不在提供该字段)。官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html

3.创建索引定义数据类型  相当于sqlserver中的创建表

postman工具来进行请求发送

{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 0
    },
    "mappings": {
        "properties": {
            "wordid": {
                "type": "integer"
            },
            "word": {
                "type": "text"
            },
            "wordsign": {
                "type": "long"
            },
            "wordhint": {
                "type": "integer"
            },
            "searchcount": {
                "type": "integer"
            },
            "createtime": {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            },
            "appstoreids": {
                "type": "nested",
                "properties": {
                    "appstoreid": {
                        "type": "long"
                    },
                    "rank": {
                        "type": "integer"
                    },
                    "apptype": {
                        "type": "integer"
                    },
                    "change":{
                        "type":"integer"
                    },
                    "isnew":{
                        "type":"integer"
                    }
                }
            }
        }
    }
}

4.es的数据类型

核心类型 字符串类型 string,text,keyword 
整数类型 integer,long,short,byte 
浮点类型 double,float,half_float,scaled_float 
逻辑类型 boolean 
日期类型 date 
范围类型 range 
二进制类型 binary 
复合类型 数组类型 array 
对象类型 object 
嵌套类型 nested 
地理类型 地理坐标类型 geo_point 
地理地图 geo_shape 
特殊类型 IP类型 ip 
范围类型 completion 
令牌计数类型 token_count 
附件类型 attachment 
抽取类型 percolator 
 
5.由于es的内存使用的是java的jvm,所以设置占用的内存最好小于32g
6.关于es的优化

//修改默认查询条数 不过不起作用好像
alarm/_settings
{
"max_result_window" : 200000000
}
2. 开启最佳压缩
对于打开了上述_source字段的index,可以通过下面的命令来把lucene适用的压缩算法替换成 DEFLATE,提高数据压缩率。
http://127.0.0.1:9200/searchresult/_settings
{
"index.codec": "best_compression"
}
3. bulk批量写入
写入数据时尽量使用下面的bulk接口批量写入,提高写入效率。每个bulk请求的doc数量设定区间推荐为1k~1w,具体可根据业务场景选取一个适当的数量。
4. 调整translog同步策略
默认情况下,translog的持久化策略是,对于每个写入请求都做一次flush,刷新translog数据到磁盘上。这种频繁的磁盘IO操作是严重影响写入性能的,如果可以接受一定概率的数据丢失(这种硬件故障的概率很小),可以通过下面的命令调整 translog 持久化策略为异步周期性执行,并适当调整translog的刷盘周期。
http://127.0.0.1:9200/searchresult/_settings
{
"index": {
"translog": {
"sync_interval": "5s",
"durability": "async"
}
}
}

5. 调整refresh_interval
写入Lucene的数据,并不是实时可搜索的,ES必须通过refresh的过程把内存中的数据转换成Lucene的完整segment后,才可以被搜索。默认情况下,ES每一秒会refresh一次,产生一个新的segment,这样会导致产生的segment较多,从而segment merge较为频繁,系统开销较大。如果对数据的实时可见性要求较低,可以通过下面的命令提高refresh的时间间隔,降低系统开销。
http://127.0.0.1:9200/searchresult/_settings
{
"index": {
"refresh_interval": "30s"
}
}
6. merge并发控制
ES的一个index由多个shard组成,而一个shard其实就是一个Lucene的index,它又由多个segment组成,且Lucene会不断地把一些小的segment合并成一个大的segment,这个过程被称为merge。默认值是Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)),当节点配置的cpu核数较高时,merge占用的资源可能会偏高,影响集群的性能,可以通过下面的命令调整某个index的merge过程的并发度:

PUT /my_index/_settings
{
"index.merge.scheduler.max_thread_count": 2
}
7. 写入数据不指定_id,让ES自动产生
当用户显示指定_id写入数据时,ES会先发起查询来确定index中是否已经有相同_id的doc存在,若有则先删除原有doc再写入新doc。这样每次写入时,ES都会耗费一定的资源做查询。如果用户写入数据时不指定doc,ES则通过内部算法产生一个随机的_id,并且保证_id的唯一性,这样就可以跳过前面查询_id的步骤,提高写入效率。

所以,在不需要通过_id字段去重、update的使用场景中,写入不指定_id可以提升写入速率。腾讯云CES技术团队的测试结果显示,无_id的数据写入性能可能比有_id的高出近一倍,实际损耗和具体测试场景相关。

3. 禁止swap,一旦允许内存与磁盘的交换,会引起致命的性能问题。 通过: 在elasticsearch.yml 中 bootstrap.memory_lock: true, 以保持JVM锁定内存,保证ES的性能。

对于数据量较小(100GB以下)的index,往往写入压力查询压力相对较低,一般设置3~5个shard,number_of_replicas设置为1即可(也就是一主一从,共两副本) 。
对于数据量较大(100GB以上)的index:
一般把单个shard的数据量控制在(20GB~50GB)
让index压力分摊至多个节点:可通过index.routing.allocation.total_shards_per_node参数,强制限定一个节点上该index的shard数量,让shard尽量分配到不同节点上
综合考虑整个index的shard数量,如果shard数量(不包括副本)超过50个,就很可能引发拒绝率上升的问题,此时可考虑把该index拆分为多个独立的index,分摊数据量,同时配合routing使用,降低每个查询需要访问的shard数量。

//复制索引和数据
http://127.0.0.1:9200/_reindex
{
"source": {
"index": "searchresult"
},
"dest": {
"index": "searchresult2"
}
}

es scroll 查询


  var c = client.Search<AwemeIncrEs>(x => x.Index(index).Query(x => x.MatchAll()).TrackTotalHits());
            int count = c.Total.ObjToInt();
            int i = 0;
            var pageCount = (int)Math.Ceiling(count / (double)size);
            var data = client.Search<AwemeIncrEs>(x => x.Index(index).Query(x => x.MatchAll()).Source(s => s.Includes(f => f.Fields(ff => ff.awemeid, ff => ff.authorid, ff => ff.total_comment, ff => ff.total_comment_incr, ff => ff.total_share, ff => ff.total_share_incr, ff => ff.total_favorite, ff => ff.total_favorite_incr, ff => ff.create_time_stamp))).Scroll(new Time(20000)).Size(size));
            while (data.Documents.Any())
            {
                i++;
                var rand = new Random().Next(0, 3);
                var host = conn.Split(',')[rand];
                string label = Guid.NewGuid().ToString();
                Console.WriteLine($"i:{i},count:{pageCount}");
                var doc = data.Documents.Select(item => new AwemeIncrDoris { dt = Utils.GetDateTime(item.create_time_stamp).Date, awemeid = item.awemeid, authorid = item.authorid, total_comment = item.total_comment, total_comment_incr = item.total_comment_incr, total_favorite = item.total_favorite, total_favorite_incr = item.total_favorite_incr, total_share = item.total_share, total_share_incr = item.total_share_incr, create_time_stamp = item.create_time_stamp }).ToList();

                var jsonData = JsonConvert.SerializeObject(doc);
                var r = HttpHelper.StreamLoadBEJson(jsonData, host, port, database, table, user, passwd, label);
                if (r != "Success")
                {
                    _logger.LogError($"AwemeProDay-error");
                }
                data = client.Scroll<AwemeIncrEs>("20s", data.ScrollId);
            }

 

awemeprocount/_delete_by_query
{"query":{"term":{"create_time_stamp":1629907200}}}


authorfansrankweek/_update_by_query {"script":{"lang":"painless","source":"if (ctx._source.create_time_stamp== 1629043200) {ctx._source.create_time_stamp=1628438400}"}}

awemeincr202108/_count {"query":{"range":{"create_time_stamp":{"gte":1629648000,"lte":1629648000}}}}

{
{"script":{"lang":"painless","source":"{ctx._source.total_favorite_incr=ctx._source.total_favorite-ctx._source.old_total_favorite}"
}
}}
ctx._source.total_comment_incr=ctx._source.total_comment-ctx._source.old_total_comment,
ctx._source.total_share_incr=ctx._source.total_share-ctx._source.old_total_share


authorvolumerank/_update_by_query
{
  "query": {
    "term": {
      "create_time_stamp": 1630201729
    }
  },
  "script": {
    "lang": "painless",
    "source": "ctx._source.create_time_stamp=params.create_time_stamp",
    "params": {
      "create_time_stamp": 1630115329
    }
  }
}


{
  "script": {
    "lang": "painless",
    "source": "if (ctx._source.create_time_stamp== 1630425600) {ctx._source.total_share_incr==ctx._source.total_share-ctx._source.old_total_share}"
  }
}

优化删除后索引
http://192.168.0.1:9190/awemeproday/_forcemerge?max_num_segments=1

http://192.168.0.1:9190/awemeproday/_forcemerge?only_expunge_deletes=true


awemeproday/_delete_by_query
{
  "query": {
    "term": {
      "doc_time_stamp": 1643558400
    }
  }
}



awemeproweek/_delete_by_query
{
  "query": {
    "term": {
      "doc_time_stamp": 1641744000
    }
  }
}

awemeprohotcommentrank/_delete_by_query
{
  "conflicts": "proceed",
  "query": {
    "range": {
      "release_time_stamp": {
        "lt": "1643644800"
      }
    }
  }
}
authorvolumerank/_settings
{"index":{"number_of_replicas":"2"}}

 

 
posted @ 2019-11-14 23:39  今晚再打老虎  阅读(630)  评论(0编辑  收藏  举报