本文从索引文档开始,后面逐步讲解索引,搜索,聚合等概念,如果有概念不能理解,可以先照着代码操作,后面会更详细的解释。
我们这里创建几个文档,用来存储user信息,在使用mysql时,一条user信息,在user表中可能是一条数据,然后这条数据中会关联其他表的id,这样多张关联表的内容,综合起来,会形成一个完整的user信息。但是在es中,我们可以把所有关于user的信息全部存在一个文档中,以user文档的形式存储,一个文档代表一个user。
存储数据到es中的行为叫做索引,索引一个文档前,需要确定这个文档存放在哪里;一个es集群可以包含多个索引,每个索引可以包含多个类型,每个类型中又可以存储不同的文档,每个文档可以有多个属性。
下面对这几个关键词进行简单的解释,部分关键词后面会详细解释。
如前所述,一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或 indexes 。
索引一个文档 就是存储一个文档到一个 索引 (名词)中以便它可以被检索和查询到。这非常类似于 SQL 语句中的 INSERT 关键词,除了文档已存在时新文档会替换旧文档情况之外。
关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。
默认的,一个文档中的每一个属性都是被索引的(有一个倒排索引)和可搜索的。一个没有倒排索引的属性是不能被搜索到的。我们将在 倒排索引 讨论倒排索引的更多细节。
在理解这些概念时,可以对比着mysql中,数据库,表,每条数据,和java中的对象,对象属性等来关联理解。
我们接下来做如下操作:
上面这四步,我们用一条命令即可完成
PUT people/user/1
{
"id":1,
"name":"张三",
"age":18,
"address":"杭州",
"interests": [ "bastkeyball", "football" ],
"create_time":"2018-02-04"
}
PUT people/user/1 :在people索引下的user类型中,新建一个文档,id为1,文档内容为括号中的。
同步到mysql中,我们可以理解为:在名为people的数据库中,有张user表,在user表中存一条记录,id为1,各个字段的值为括号中的内容。
不同的是,在mysql中,做此操作,要建库,建表,然后才能插入,而es中,索引和存储等过程一行命令全部完成,es在内部会搞定一切。
我们再添加几条记录:
PUT people/user/2
{
"id":2,
"name":"李四",
"age":23,
"address":"太原",
"interests": [ "bastkeyball", "football" ],
"create_time":"2017-05-04"
}
PUT people/user/3
{
"id":3,
"name":"王五",
"age":48,
"address":"杭州",
"interests": [ "bastkeyball", "football" ],
"create_time":"2018-02-04"
}
PUT people/user/4
{
"id":4,
"name":"张飞",
"age":27,
"address":"宁波",
"interests": [ "bastkeyball", "football" ],
"create_time":"2018-02-04"
}