为什么ES不适合做数据存储

文章探讨了为何ES不适合用作数据存储,主要原因是mapping不可更改、无法实现多对多关联、缺乏用户验证和权限控制,以及初期shards数量不易确定。尽管ES在检索和统计上有优势,但其设计目的与数据存储需求不符,不适用于未来需求变化大的场景。

前段时间公司想尝试用ES来存一部分数据,以此缓解数据增长带来的对数据库的压力。ES的介绍很多地方都有,就不再写了。在研究了一段时间后,发现ES不适合做为数据存储使用,理由如下:

  1. mapping不可改,不能改index属性。ES中以定义的mapping不能修改名字和属性,无法修改名字勉强还能接受,但无法修改属性。官方文档中介绍了几种修改mapping的方法。一个是新建一个字段,程序中所有地方修改名字,这对于复杂的项目容易出错,而且无法保留原来的数据;另一个是利用alias创建一个新的索引,但是所有数据需要重新导入,这需要很长时间,操作性不强。
  2. 无法多对多。ES中提供3种关联关系:Field collapsing(严格来说不是关联),Nested object,Parent-child。前两种都是直接将一个mapping声明在另一个mapping中,第三种关联是在创建子文档是指明他的父文档,但是一个子文档只能有一个父文档,因此也不能实现多对多的关联。其实如果理解了ES的目的是提升检索效率,就不难理解为什么没有多对多关联了,在关系数据库里这就是个效率瓶颈。
  3. 没有用户验证和权限控制。ES本身的访问权限可以通过nginx进行控制,但是同一个ES中不同索引间目前是没有权限控制的。
  4. 从ES设计的初衷看,为了检索,为了统计。这个从字段的store属性中可以看出来,查看ES手册(https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-store.html)可以发现,默认情况下字段的原始值是不会被保存的,这跟数据存储是南辕北辙了。
  5. 项目开始时不好确定shards数量。少了以后扩展不方便,多了一开始影响性能。这个可以通过将type命名为doctype-yyyymmdd来解决,每天都生成新的一个或多个shard,但是注意在搜索时需要在doctype-*中搜索。
  6. ES非常适合特定的需求,但不适合用于数据存储。ES索引速度快,扩展方便,性能优异,但在功能上不适合作为数据库使用。数据存储的目的是为了以后能方便的使用,不仅是针对当前的需求,也要为未来可能出现的需求做准备。由于ES有以上几点问题,无法适应需求变化。

ES适合的场景

  1. 检索。ES本身作为一个搜索引擎,用来处理检索的任务再合适不过。你可以在线上项目中直接将内容写入ES以提供检索服务,也可以把以往的数据导入ES以处理特定的需求。关于ES和Solr的比较以后有时间的话会写一篇
  2. 统计。ES的统计也是基于检索功能的,聚合功能使得统计结果处理起来非常方便。如果你只需要统计而不用检索,可能有其他工具更适合你,比如Spark SQL。
<think>嗯,用户想知道Elasticsearch适合存储和检索哪些数据类型。首先,我得回忆一下Elasticsearch的主要功能。它作为一个分布式搜索引擎,主要用于全文搜索,对吧?比如日志或者文本内容。那用户可能的应用场景包括日志分析、电商搜索之类的。 然后,结构化数据呢?虽然Elasticsearch是传统的关系型数据库,但它确实支持结构化数据,比如数值、日期这些。比如电商中的商品信息,价格、库存这些字段可以用作过滤或聚合。这里可能需要提到它的倒排索引和列式存储,用来高效处理这类查询。 接下来是地理空间数据。记得Elasticsearch有Geo-point和Geo-shape类型,支持地理位置查询,比如附近的点或者形状相交。可能用户有地图相关的应用,比如找附近的店铺,所以需要说明PostGIS和R树索引的对比,引用中的多维索引部分可能会有帮助。 时间序列数据也是一个重点,尤其是日志和监控数据。Elasticsearch的时间范围查询和聚合功能很强大,结合Rollup可以数据降采样,适合处理大量时间序列数据,比如应用监控或者IoT设备的数据。 还有向量数据,虽然这是Elasticsearch最初的设计目标,但现在支持向量相似度搜索,比如图片或语义搜索。过需要注意性能问题,尤其是大数据集时的script_score计算,引用里提到暴力计算可能损耗性能,所以得提醒用户注意优化。 半结构化数据,比如JSON文档,Elasticsearch的动态映射可以自动推断结构,适合处理灵活的日志或用户行为数据。但需要提到动态映射可能带来的问题,比如字段类型冲突,用户可能需要手动管理映射。 此外,可能用户没考虑到混合查询的情况,比如先全文搜索再向量搜索,这时候Elasticsearch的优势在于可以结合多种查询方式。需要引用相关部分,比如先query再向量算分,说明适用场景。 最后,要总结适合Elasticsearch的情况,比如事务处理或者复杂关联查询,避免用户误用。同时,生成相关问题的时候,要覆盖数据类型、性能优化、应用场景和局限性,帮助用户进一步了解。</think>Elasticsearch 适用于以下类型数据的存储与检索,其核心优势体现在全文搜索、结构化查询和实时分析能力: ### 一、全文文本数据 1. **非结构化文本**:支持分词、模糊搜索、同义词扩展等特性,适合存储日志、新闻内容、商品描述等文本数据。例如搜索「分布式系统」时能自动匹配相关段落[^1][^4]。 2. **多语言文本**:内置多种语言分词器(如IK中文分词),支持跨语言搜索优化。 ### 二、结构化数据 1. **数值型数据**:支持整数、浮点数等数值范围查询(如价格区间过滤),通过倒排索引和列式存储(doc_values)实现高效聚合计算。 2. **日期数据**:内置时间范围查询优化,适用于日志时间戳、订单创建时间等场景。 3. **布尔值/枚举值**:如用户状态(活跃/禁用)、商品类别等字段的精确匹配。 ### 三、地理空间数据 1. **Geo-point**:存储经纬度坐标,支持「附近5公里商家」类查询,使用R树索引加速地理围栏判断[^2]。 2. **Geo-shape**:处理多边形、线形等复杂地理图形的关系判断(如区域覆盖分析)。 ### 四、时序数据 1. **日志与监控数据**:结合时间范围查询和Rollup API,可高效处理TB级日志的时间序列聚合分析[^1]。 2. **物联网传感器数据**:支持高频写入和基于时间窗口的统计计算。 ### 五、向量数据 1. **语义向量**:通过`dense_vector`字段类型存储128-4096维向量,支持余弦相似度等算法实现语义搜索[^3]。 2. **混合查询**:可先执行关键词过滤,再对结果集进行向量相似度排序(如电商场景的「红色连衣裙+相似推荐」)。 ### 六、半结构化数据 1. **JSON文档**:动态映射(Dynamic Mapping)允许直接存储嵌套JSON,适用于用户行为数据、设备元数据等灵活结构。 $$ \text{适用性公式:查询延迟} \propto \frac{\text{数据量}}{\text{分片数}} + \text{索引复杂度} $$ ### 典型应用场景 - 电商平台:商品标题搜索+属性过滤+推荐排序 - 日志分析:基于时间范围的错误日志聚合 - 地理位置服务:实时附近司机匹配 - AI应用:结合文本搜索与向量相似度检索
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值