"created_time": {
"type": "date",
"format”:”yyyy-MM-dd'T'HH:mm:ssZZ”
}
Elasticsearch 你该知道的事
Note
|
ES的默认刷新时间 |
最佳实践
注意
-
数据库应该是ES数据的来源,应该避免从ES中取回数据修改后再写入
-
ES中只存储需要检索的字段,通过ES获取到Id,再根据Id从数据库中获取数据
-
所有字段都存储了源数据,才能使用update, 否则字段会丢失
-
ES只允许新增字段 (lucene决定的)
-
es的source是单独作为一个字段存储的,而且是保持传入的样式原样保存,假设字段A类型为long,如果传入的
doc={A: "12345"}
,即使A为string类型也是可以正确录入的,但是返回的source中字段A还是保持string形式"12345",不会转换成配置的long类型。 -
bool query中的should默认不做必须命中要求(只有should条件除外),bool filter中的should必要至少命中其中一个子条件。
-
ES在未设置获取记录条数的时候,默认只返回10条
-
如果ES中需要传入时间,记得带上时区
private static final Gson GSON = new GsonBuilder().registerTypeAdapter(Date.class, new UtcDateTypeAdapter()).create();
运维优化
-
使用SSD
-
使用ES自动生成的Id或者数据库中的自增Id,避免使用UUID-4, UUID-4是随机字符串压缩率较低
索引优化
{
"persistent" : {
"indices.store.throttle.max_bytes_per_sec" : "100mb"
}
}
-
段合并速度限制,默认的设置是 20M/s, 如果使用了SSD,可以设置为 100M/s
-
减少flush次数,配置translog大小阈值
-
减少refresh的次数,如果实时性要求不高的时候,可以设置较长的
refresh_interval
时间 -
减少副本数量
number_of_replicas
,副本可以保证集群可用性,搜索并发数,但是会严重降低写效率
查询优化
-
选择每次查询都会携带、且基本不会更新的字段作为routing
-
增加副本梳理,副本可以参与查询,提高搜索吞吐量
-
对于不需要评分的字段使用filter来查询
数据导入
-
刷新时间改为 -1
-
将副本数设置为 0
-
使用bulk request
-
数据的全量导入一般ES写入速度是个瓶颈,使用生产消费者模式可以加快导入速度
浏览 20222 次