商品搜索用数据库 LIKE 撑不住了,日志散落在十几台机器上,每次出问题都要逐台登录翻文件。这类事情做多了,团队迟早会考虑 Elasticsearch。自己搭集群要管节点规划、版本升级、安全认证和故障恢复,没有专职运维的团队很难扛住。阿里云ES是托管版的 Elasticsearch,把这些工作交给平台,开发同学可以把时间留给业务。这篇文章从两个典型场景出发,讲讲阿里云ES能做什么、选型时怎么想,以及哪些地方容易栽跟头。

阿里云ES是什么
阿里云ES基于开源 Elasticsearch 构建,兼容开源 API。常用的索引、文档、查询和聚合操作,大多数可以直接沿用。平台在开源版本之上额外提供 Kibana 可视化、安全认证、快照备份和监控告警,节点和存储也可以按需扩容。已经熟悉 Elasticsearch 的团队迁移成本通常不高,主要工作是梳理索引映射,再调整客户端的连接配置。
两个典型场景
电商商品搜索
某中型电商团队最初用数据库的 LIKE 查询做商品搜索。商品量超过百万后,搜索响应经常超过 2 秒,促销期间数据库压力明显上升。团队用数据同步任务把商品数据写入阿里云ES,用中文分词器处理商品名称,并配置同义词词典,把“手机”“智能机”“手机壳”这类词关联起来。调整后,搜索平均响应时间降到 100 毫秒以内,大促期间数据库的查询压力也随之减轻。
这个案例值得学的是把搜索从数据库里拆出来。LIKE 查询几乎处理不了中文分词,用户搜“智能机”,就可能搜不到写着“智能手机”的商品。分词和同义词配好之后,改动主要落在搜索层。同义词词典需要有人持续维护,新品类上线时记得同步更新,否则过一阵子又会出现搜不到的情况。
业务日志集中分析
另一个团队的服务分布在十几台云服务器上,排查问题时要逐台登录、翻看日志文件,耗时长,还容易漏掉关键信息。他们把应用日志采集到阿里云ES,在 Kibana 里按服务名、时间段和错误码筛选,并配置告警规则:某接口的错误率超过阈值,就自动通知值班人员。排查效率因此提升不少,问题发现时间也从几十分钟缩短到几分钟。
日志场景有个容易忽略的问题:数据增长快,而且很多日志过了几天就没人再查。如果一直写进同一个索引,磁盘很快会吃紧,查询也会变慢。更稳妥的做法是按天或按周切分索引,再用索引生命周期策略处理过期数据。告警阈值也别一上来就设得很敏感,先观察一段时间的正常错误率,再确定阈值,否则很容易变成没人看的噪音。
选型前先想清楚这几件事
选集群规格之前,建议先把数据规模、查询模式和可用性要求写下来,再去对照规格。下面几点最好逐条确认:
- 每天新增多少数据,要保留多久。这决定存储容量和分片规划。保留周期如果定得模糊,磁盘通常会在最不方便的时候写满。
- 查询属于哪一类。全文检索、聚合分析和精确匹配消耗的资源差别很大,拿一批真实查询去压测,比只看规格表靠谱。
- 应用部署在哪里。尽量和应用服务放在同一地域、同一专有网络里,既减少网络延迟,也避免服务直接暴露在公网上。
- 版本怎么选。优先用平台支持的稳定版本,并留意版本的维护周期。停在已经不再维护的版本上,之后升级只会更麻烦。
性能与成本,哪些做法真有用
集群上线后,性能和成本要持续关注。下面几条在实际使用中比较常见:
- 映射设计要克制。只对需要检索的字段建立索引,不需要搜索的大字段可以关闭索引,或者只存到其他位置。字段不是越多越好,每个字段都会占用空间。
- 按时间拆分索引。日志类数据按天或按周建索引,过期数据交给索引生命周期策略,自动删除或转到低成本存储。清理时直接删整个索引,比在大索引里逐条删除高效得多。
- 分片数量要适中。分片太小,集群管理开销会变大;分片太大,节点故障后的恢复会变慢。一般以几十 GB 作为参考范围。主分片数在索引创建后通常不能直接修改,建索引时就要想清楚,不要等数据堆起来才发现不合适。
- 把不需要算分的条件放进 filter。状态、时间范围、类型这类精确筛选不影响相关性评分,放进 filter 上下文后可以复用缓存,查询会更稳定。
安全与运维
搜索服务承载的往往是真实业务数据,安全配置不能省。开启访问认证,给不同应用分配独立账号,并按最小权限原则授权。这样即使某个应用的账号泄露,影响范围也能控制在一定程度内。访问来源用白名单或专有网络限制,不要图省事把地址开放给所有人。
备份也一样。定期执行快照,更要验证快照能不能恢复。很多团队有备份策略,真出事时才发现快照从来没有成功恢复过。运维层面,给 CPU、内存、磁盘使用率和查询延迟配置监控告警,磁盘快满、查询变慢这类问题要在用户感知之前发现。
写在最后
阿里云ES适合想快速获得搜索和日志分析能力、又不想投入大量运维精力的团队。选型前先把数据量、查询类型和可用性要求说清楚,建索引时留好分片和时间切分的余地,再配上监控和安全策略,大多数场景都能稳定运行。文中的案例可以当作参考框架,具体规格和指标还是要用自己的数据压测一遍。