为什么Elasticsearch不适合做数据存储?(转学习使用)
一、问题描述
公司想尝试使用Elasticsearch来存一部分数据,以此缓解数据增长带来的对数据库的压力。在研究了一段时间后,发现Elasticsearch不适合作为数据存储使用。
二、理由如下
1、mapping不可改,不能改index属性。Elasticsearch中以定义的mapping不能修改名字和属性,无法修改名字勉强能接受,但无法需要改属性。
官方文档中介绍了几种修改mapping的方法。一个是新建一个字段,程序中所有地方修改名字,这对于复杂的项目容易出错,而且无法保留原来的数据;另一个是利用aliaa创建一个新的索引,但是所有数据需要重新导入,这需要很长时间,操作性不强。
2、无法多对多。Elasticsearch中提供3中关联关系,Field collapsing(严格来说不是关联),Nested object,Parent-child。前两种都是直接将一个mapping声明在另一个mapping中,第三种关联是在创建子文档是指明他的父文档,但是一个子文档只能有一个父文档,因此也不能实现多对多的关联。其实如果理解了ES的目的是提升检索效率,就不难理解为什么没有多对多关联了,在关系数据库里这就是个效率瓶颈。
3、没有用户验证和权限控制。ES本身的访问权限可以通过nginx进行控制,但是同一个ES中不同索引间目前是没有权限控制的。从ES设计的初衷看,为了检索,为了统计。这个从字段的store属性中可以看出来,查看ES手册(https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-store.html)可以发现,默认情况下字段的原始值是不会被保存的,这跟数据存储是南辕北辙了。
4、项目开始时不好确定shards数量。少了以后扩展不方便,多了一开始影响性能。这个可以通过将type命名为doctype-yyyymmdd来解决,每天都生成新的一个或多个shard,但是注意在搜索时需要在doctype-*中搜索。
5、ES非常适合特定的需求,但不适合用于数据存储。ES索引速度快,扩展方便,性能优异,但在功能上不适合作为数据库使用。数据存储的目的是为了以后能方便的使用,不仅是针对当前的需求,也要为未来可能出现的需求做准备。由于ES有以上几点问题,无法适应需求变化。
ES适合的场景
1、检索。ES本身作为一个搜索引擎,用来处理检索的任务再合适不过。你可以在线上项目中直接将内容写入ES以提供检索服务,也可以把以往的数据导入ES以处理特定的需求。关于ES和Solr的比较以后有时间的话会写一篇
2、统计。ES的统计也是基于检索功能的,聚合功能使得统计结果处理起来非常方便。如果你只需要统计而不用检索,可能有其他工具更适合你,比如Spark SQL。
为什么Elasticsearch不适合做数据存储?(转学习使用)的更多相关文章
- SharedPreferences介绍,用来做数据存储
sharedPreferences是通过xml文件来做数据存储的. 一般用来存放一些标记性的数据,一些设置信息. *********使用sharedPreferences存储数据 public sta ...
- JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践
企业数据越存越多,存储容量与查询性能.以及存储成本之间的矛盾对于技术团队来说是个普遍难题.这个难题在 Elasticsearch 与 ClickHouse 这两个场景中尤为突出,为了应对不同热度数据对 ...
- Android课程---关于数据存储的学习
activity_data1.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
- 51单片机RAM 数据存储区学习笔记
转自:http://www.eepw.com.cn/article/216237_2.htm 1.RAM keil C语言编程 RAM是程序运行中存放随机变量的数据空间.在keil中编写程序,如果当前 ...
- Android课程---关于数据存储的学习(2)
手机外部存储的学习 activity_data2.xml <?xml version="1.0" encoding="utf-8"?> <Li ...
- Android课程---关于数据存储的学习(3)之数据库和事务
DataActivity3.java package com.hanqi.test5; import android.content.ContentValues; import android.dat ...
- Android课程---关于数据存储的学习之总结
- 万亿级日志与行为数据存储查询技术剖析——Hbase系预聚合方案、Dremel系parquet列存储、预聚合系、Lucene系
转自:http://www.infoq.com/cn/articles/trillion-log-and-data-storage-query-techniques?utm_source=infoq& ...
- iOS常用的几种数据存储方式
之前由于刚入行不久,对数据持久化不是很了解,尤其是用数据库存储大量数据的操作.经过摸索就在此总结一下,方便以后查阅 下面就简单介绍一下: 1.NSUserDefaults 感觉最常用的小量数据,属性, ...
随机推荐
- Python特殊序列\d能匹配哪些数字?
在缺省语言环境下,老猿对\d的匹配范围做了个测试,下面的数字包含半角数字.全角数字.中文数字,测试语句如下: >>> m=re.search(r'(\d*)(\D*)(\d*)',' ...
- web移动端css reset
通用版css reset,pc端使用只需要修改html{font-size: 10px;}为html{font-size: 12px;} @charset "utf-8"; htm ...
- Tomcat 知识点总结
Tomcat 学习笔记.本文相关配置均为 tomcat8 下,其他版本可能略有不同.如有错误请多包涵. 架构 首先,看一下整个架构图 接下来简单解释一下. Server:服务器.Tomcat 就是一个 ...
- 题解-CF163E e-Government
题面 CF163E e-Government 给 \(n\) 个字符串 \(s_i\) 和 \(q\) 个询问,刚开始字符串都服役.每次操作将集合中的一个字符串设为退役或服役,或查询与文本串 \(S_ ...
- web前端js实现资源加载进度条
进度条核心方法,通常j不考虑判断到100,根据项目中的图片数量可能有所差异所以到95就可以了 //根据图片load进度条 function loadingAsImgLength(){ var prec ...
- Java经典小游戏——贪吃蛇简单实现(附源码)
一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...
- 三、TestNG的基本注解(1)
Before类别和After类别注解 举例说明 创建两个TestNGAnnotationTest.java和TestNGAnnotationTest2.java的类 TestNGAnnotationT ...
- 七、Jmeter测试元件-线程
线程组元素是任何测试计划的起点.所有控制器和采样器必须在线程组下.其他元素(例如,侦听器)可以直接放置在测试计划下. 名称:相当于一个业务流程 继续:当取样器出错时 会继续请求: 举例:1-当一个线程 ...
- 使用collectd+influxdb+grafna监控进程的健康状态
一,前言 本文将介绍如何使用collectd+influxdb+grafna进行进程的监控,监控项为:进程健康状态. 思路为:使用collectd的processes插件进行程序进程的监控,储存到in ...
- tomcat中配置jndi数据库源
tomcat添加依赖 lib目录下添加依赖mysql-connector-java-8.0.16 配置数据源 介绍两种方法:tomcat中配置或web应用中配置 tomcat/conf/context ...