上文《Elasticsearch优化系列(三)解决毛刺及开启压缩等》我们解决了Elasticsearch的毛刺和压缩事宜。本文我们介绍下Elasticsearch参数相关的一些配置。调整这些配置其实也是可以在一定程度上对Elasticsearch做一些优化的。
1)使用有序ID
在我们的日常使用中,一般对于documentid来说我们不悔直接使用uuid,而是根据一定的策略生成有序的id,比较常用的主要是以年月日时分秒(14)位+用户/场景的4位id,这个和淘宝的订单策略生成是一样的,主要有几个好处:
1、id有序递增 2、id能反映相关的信息
2)禁用doc values
elasticsearch中的数据主要是为了快速的索引和查询,但是每一张index里面还是有很多的字段是不需要聚合和排序的,因此对于这些不需要聚合和排序的字段,我们统一禁用Doc values。这里禁用doc values的时候很简单,就是在mapping的时候设置doc values为false,示例图如下:
3)使用keyword替代Text
这里的话像我们目前的业务来说,使用elasticsearch主要是为了查询对应的id或者做一些轻度聚合,业务中虽然也有用户相关的username字段,但是场景是完全匹配,所以我们这里对待像这种不需要做模糊检索需求的字段,但是又需要指定这些字段查询的,统统使用keyword来替代Text类型。
4)减少非必要字段
上面第三点我们提到大部分场景主要是为了查询相关的id的,此时我们通过id去其他的存储里面进行关联查询,所以elasticsearch中主要索引的是一些必要的字段,非必要的字段主要是存储在其他的存储设施里面的。
5)创建索引和查询指定路由值
像我们这种做政企项目的,一般来说预算有限,所以服务器数量这些都是清晰可见。对此我们在前期实施索引创建查询的时候,都是指定了Rouing路由的值,这样子可以直接精确到具体的分片,提高查询效率。下面我们举例下,创建索引的时候指定路由值:
PUT /${index_name} { "mappings": { "properties": { "uid": { "type": "keyword" }, "uname": { "type": "text" } } }, "settings": { "index.routing_field": "uid" } }
然后插入数据的时候指定路由:
PUT /${index_name}/_doc/1?routing=123 { "uid": "123", "username": "张三" }
查询的时候指定路由:
POST ${index_name}/_search?routing=123 { "query": { "match": { "username": "zhangsan" } } }
备注:
1、这里路由只是举个例子,实际情况一般根据类型,分组这些场景进行路由。
6)拒绝深度分页
一般来说我们elasticsearch里面的数据都会在其他存储设施里面存储一份,所以对于Elasticsearch来说,我们仅把他用于搜索的场景业务,此时就要拒绝深度分页。虽然在elasticsearch中,提供了scroll进行深度分页的查询,但是一般应用于业务的,我们使用searchAfter的方式进行分页。这种分页用于普通的搜索业务即可。涉及到深度分页,则使用其他的存储设施进行遍历。
这里我们给一个通用的建议:
1、使用到elasticsearch的分页场景,我们不要显示xxx多少页和第xxx页,而是直接显示上一页,下一页。
除了上诉的一些用法之外,其实网上还有其他的案例,例如:
1、如果搜索结果不需要近实时的准确度的话,可以考虑把每个索引的index.refresh_interval配置修改大一点。
2、如果做大批量导入的时候,可以暂时考虑把index.refresh_interval设置为-1,即关掉刷新,等索引完成之后手动刷新,然后再打开。
3、如果做大批量导入的时候,可以暂时考虑把index.number_of_replicas副本设置为0,即关掉副本,等索引完成后再重新开启
以上就是在使用elasticsearch中的一些优化手段。
还没有评论,来说两句吧...