index
"index.refresh_interval": "5s",
"index.merge.scheduler.max_thread_count": "4", //后台合并segment线程数,一般=核数/2;
"index.merge.policy.floor_segment": "10mb", //根据磁盘处理速度灵活设置,太大磁盘占满反而降低查询性能
"index.max_result_window": "100000000",
mapping
"properties": {
"name1": {
"type": "text",
"norms": false, //开启norms之后,每篇文档的每个字段需要一个字节存储norms。对于 text 类型的字段而言是默认开启norms的,因此对于不需要评分的 text 类型的字段,可以禁用norms
"fielddata": true //开启后 可排序,聚合
},
"name2": {
"type": "text",
"norms": false
},
"age": { "type": "integer", "doc_values": false } //禁用后 ,节省磁盘空间,不能sort、aggregate、access the field from script
}
1.segment合并;索引节点粒度配置index.merge.policy.floor_segment=xx mb;segment默认最小值2M
2.索引时不需要做打分的字段,关闭norms选项,减少倒排索引内存占用量;字段粒度配置omit_norms=true;
3.BoolQuery 优于 TermQuery;目前需求场景全部不需要用到分词,所以尽可能用BoolQuery;
4.避免使用对象嵌套结构组建document,建议优化为一个扁平化结构,查询多个扁平化结构在内存做聚合关联;
5.设定字符串类型为不分词,可以用于字符串排序,但是比起数字排序会消耗cpu,搜索效率更低,慎用;
6.cache设置,就目前数据业务类型,保持默认配置即可,设值fielddata.cache之类的缓存命中率低,反而吃掉了ES集群的一部分内存;
索引性能优化建议:
1.调小索引副本数;针对索引节点粒度:curl -XPUT http://xxxx:9200/m_pd_cu_id_gps_2es_inc_hi_out/_settings -d '{"number_of_replicas":1}'
2.设置延迟提交,延迟提交意味着数据提交到搜索可见,有延迟,需要结合业务配置;针对索引节点粒度:curl -XPUT http://xxxx:9200/m_pd_cu_id_gps_2es_inc_hi_out/_settings -d '{"index.refresh_interval":"10s"}';默认值1s;
3.设置索引缓冲buffer,最大512m,默认值是jvm的10%;ES集群粒度config/elasticsearch.yml :indices.memory.index_buffer_size = 10%
4.适当减少备份数,必要字段只需要提供搜索,不需要返回则将stored设为false;
如果ES提交索引请求达到瓶颈,一般任务队列task-queue为50,可以设置task-queue队列,提升搜索集群索引能力;
5.索引mapping约束尽量使用Dynamic =false 非动态mapping,使用不当很容易插入冗余的的数据导致性能下降