Spring项目实现过滤搜索该选Spring Elasticsearch还是自研方案?
选型结论
你当前的场景完全不需要引入Elasticsearch,也不需要做复杂的自研实现,用现有数据库的原生能力就可以完全满足需求,研发和运维成本最低,同时能兼顾写入性能。
具体实现方案
- 索引优化:你需要给常用的等值过滤列(也就是用到
x = y这类条件的列)按区分度从高到低建联合索引,保证经过等值过滤后结果集稳定落在50-100条的量级,这一步查询耗时基本在毫秒级。 - 近似匹配实现:因为过滤后结果集极小,近似匹配完全不用额外引入搜索引擎能力:
- 如果用MySQL 8.0及以上版本,直接调用原生函数
EDIT_DISTANCE(目标文本列, 用户输入)计算编辑距离,按距离从小到大排序取topN即可,性能完全足够。 - 如果数据库不支持内置编辑距离函数,在应用层引入通用文本工具包的Levenshtein距离计算类,对过滤后的几十条数据做内存计算排序,耗时可以忽略不计。
- 如果用MySQL 8.0及以上版本,直接调用原生函数
为什么不推荐Elasticsearch
- 额外运维成本高:ES需要单独部署、监控、维护集群可用性,对于30万条以内的小数据集来说属于严重的资源浪费。
- 数据一致性成本高:引入ES就需要做数据库和ES的双写同步,不管是用binlog同步还是应用双写,都会增加代码复杂度,还会额外损耗写入性能,和你兼顾写入性能的需求相悖。
- 没有性能优势:你当前的场景下,数据库原生方案的查询耗时完全能控制在10ms以内,比跨网络请求ES的耗时还要低。
什么情况下需要考虑换ES
如果后续业务规模上涨,满足以下任意条件时再考虑迁ES即可:
- 单表数据量超过1000万,且等值过滤后剩余结果集仍超过1000条需要做近似匹配
- 需要支持多文本列的模糊检索、分词检索等更复杂的搜索需求
内容的提问来源于stack exchange,提问作者ShayShoq
相关产品推荐
相关产品推荐

