移除索引中的类型

  1. 在同一个索引的不同类型中,只能存储相同字段的相同类型,因为一个索引是一个 lucene,不同类型的所有字段都会映射其中,不同类型同一字段只对应到其中的一个地段。
  2. 最重要的是,存储不同实体的数据会造成数据稀疏(一个实体中的大部分字段在另一个实体中是不存在的),这会干扰 lucene 有效压缩文档的性能。

优点:
有利于更好的评分;

原替代方案:
可以在字段定义中使用显示的 type

参考:
https://www.elastic.co/guide/en/elasticsearch/reference/6.3/removal-of-types.html#_index_per_document_type_2

JVM 调优总结

典型设置

  1. -Xmx3500m:设置 JVM 最大可用内存 3500M
  2. -Xms:设置 JVM 初始默认分配的堆内存(一般设置与 Xmx 相同,以避免在每次 GC 后调整堆内存大小)
  3. -Xmn:设置新生代大小。(新生代太小,导致 minor gc 频繁,也会导致大量对象进入老生代,触发 full gc;新生代太大,导致老生代太小,full gc 频率上升)
  4. Xss:设置每个线程的堆栈大小。

何时使用父子文档

  1. 明确是否需要父子文档
  2. es2.x 使用了 doc values 方式,降低了内存的使用
  3. 通用可视化插件一般不支持父子文档,不能快速查看效果
  4. 子文档跟随父文档存储,shard 会出现不均衡的情况
  5. 减少了数据的存储量,更容易更新存储父子文档
  6. 和 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集群的一部分内存;

参考:
https://my.oschina.net/u/4353003/blog/3235017/print