移除索引中的类型
- 在同一个索引的不同类型中,只能存储相同字段的相同类型,因为一个索引是一个 lucene,不同类型的所有字段都会映射其中,不同类型同一字段只对应到其中的一个地段。
- 最重要的是,存储不同实体的数据会造成数据稀疏(一个实体中的大部分字段在另一个实体中是不存在的),这会干扰 lucene 有效压缩文档的性能。
优点:
有利于更好的评分;
原替代方案:
可以在字段定义中使用显示的 type
JVM 调优总结
典型设置
- -Xmx3500m:设置 JVM 最大可用内存 3500M
- -Xms:设置 JVM 初始默认分配的堆内存(一般设置与 Xmx 相同,以避免在每次 GC 后调整堆内存大小)
- -Xmn:设置新生代大小。(新生代太小,导致 minor gc 频繁,也会导致大量对象进入老生代,触发 full gc;新生代太大,导致老生代太小,full gc 频率上升)
- Xss:设置每个线程的堆栈大小。
何时使用父子文档
- 明确是否需要父子文档
- es2.x 使用了 doc values 方式,降低了内存的使用
- 通用可视化插件一般不支持父子文档,不能快速查看效果
- 子文档跟随父文档存储,shard 会出现不均衡的情况
- 减少了数据的存储量,更容易更新存储父子文档
- 和 cardinality 比较,更加麻烦,但是更加快速
elasticsearch 搜索建议及性能调优过程
硬件配置:
https://www.elastic.co/guide/cn/elasticsearch/guide/cn/hardware.html
iostat
- 查看 segment 使用
curl ‘http://localhost:9200/_cat/segments/index_name?v&h=shard,segment,size,size.memory’
- 手动合并 segment
curl -XPOST ‘http://localhost:9200/_forcemerge?max_num_segments=1‘
- 加配置项 index.merge.policy.floor_segment 设置每个segment最小值,index.merge.scheduler.max_thread_count ES集群负载较低时,后台合并segment线程数,一般=核数/2
curl -XPUT http://localhost:9200/index_name/_settings -d ‘{“index.merge.policy.floor_segment”:”100mb”}’
curl -XPUT http://localhost:9200/index_name/_settings -d ‘{“index.merge.scheduler.max_thread_count”:”2”}’
【总结】
搜索性能优化建议:
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集群的一部分内存;