ES数据架构的主要概念与关系数据库Mysql对比
这里写图片描述
(1)关系型数据库中的数据库(DataBase),等价于ES中的索引(Index)
(2)一个数据库下面有N张表(Table),等价于1个索引Index下面有N多类型(Type),
(3)一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成。
(4)在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。
与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。
(5)在数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT/POST、删Delete、改_update、查GET.
ES的应用场景
通常我们面临问题有两个:
1)新系统开发尝试使用ES作为存储和检索服务器;
2)现有系统升级需要支持全文检索服务,需要使用ES。
ES不是数据库,它适合于海量数据、更新频率很低的数据(ES没有事务也不适合处理并行更改数据)。
ES更适合处理关系相对简单稳定的数据,一些关系比较复杂的数据用mysql这样的关系数据库用sql很容易实现,但是es就相当的复杂了。
我正在尝试百万数据记录在涉及两个表联查场景的两个数据库的实测:希望通过一些更具体的需求场景对两种数据库的应用从实现和性能角度方面做进一步的分析。
多字段查询及两表关联查询
ES本身是支持对同一个表内同时对多个字段进行多条件过滤查询的。这个没啥好说的。
对于两个表查询例如:
Table1:
classID className
1 班级名
Table2:
stuID classID stuName
1 班级ID 学生名
我要查询1班内所有的学生名。 这对于mysql是很好实现的。
对于ES可以采用“嵌套式对象Nested”。从数据结构上来说就是如下形式的json对象
{
stuID: 1,
stuName: 刘明,
classInfo: //对于一个学生只在一个班级里面的情况不需要这个对象数组这里只是为了说明实现
[ {
classID: 1,
className:魔法班
},
{
classID: 2,
className:科技班
}
......
]
},
........