Elasticsearch 你该知道的事

创建:xiaozi · 最后修改:xiaozi 2019-07-27 17:06 ·
Note

ES的默认刷新时间 refresh_interval 是1s,一个文档从建立索引到能被搜索出来需要1s的时间

最佳实践

注意

  1. 数据库应该是ES数据的来源,应该避免从ES中取回数据修改后再写入

  2. ES中只存储需要检索的字段,通过ES获取到Id,再根据Id从数据库中获取数据

  3. 所有字段都存储了源数据,才能使用update, 否则字段会丢失

  4. ES只允许新增字段 (lucene决定的)

  5. es的source是单独作为一个字段存储的,而且是保持传入的样式原样保存,假设字段A类型为long,如果传入的 doc={A: "12345"},即使A为string类型也是可以正确录入的,但是返回的source中字段A还是保持string形式"12345",不会转换成配置的long类型。

  6. bool query中的should默认不做必须命中要求(只有should条件除外),bool filter中的should必要至少命中其中一个子条件。

  7. ES在未设置获取记录条数的时候,默认只返回10条

  8. 如果ES中需要传入时间,记得带上时区

"created_time": {
    "type": "date",
    "format”:”yyyy-MM-dd'T'HH:mm:ssZZ”
}
private static final Gson GSON = new GsonBuilder().registerTypeAdapter(Date.class, new UtcDateTypeAdapter()).create();

运维优化

  1. 使用SSD

  2. 使用ES自动生成的Id或者数据库中的自增Id,避免使用UUID-4, UUID-4是随机字符串压缩率较低

索引优化

{
    "persistent" : {
        "indices.store.throttle.max_bytes_per_sec" : "100mb"
    }
}
  1. 段合并速度限制,默认的设置是 20M/s, 如果使用了SSD,可以设置为 100M/s

  2. 减少flush次数,配置translog大小阈值

  3. 减少refresh的次数,如果实时性要求不高的时候,可以设置较长的 refresh_interval 时间

  4. 减少副本数量 number_of_replicas ,副本可以保证集群可用性,搜索并发数,但是会严重降低写效率

查询优化

  1. 选择每次查询都会携带、且基本不会更新的字段作为routing

  2. 增加副本梳理,副本可以参与查询,提高搜索吞吐量

  3. 对于不需要评分的字段使用filter来查询

数据导入

  1. 刷新时间改为 -1

  2. 将副本数设置为 0

  3. 使用bulk request

  4. 数据的全量导入一般ES写入速度是个瓶颈,使用生产消费者模式可以加快导入速度


浏览 20155 次

Home - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-19 20:36
浙ICP备14020137号-1 $Map of visitor$