文章目录
- 前言
- 一、基本概念
- 1.1 Index(索引)
- 1.2 Type(类型)
- 1.3 Document(文档)
- 1.4 ES与关系型数据库对比
- 1.5 倒排索引
- 二、初步检索
- 2.1 _cat
- 2.2 索引一个文档(保存)
- 2.3 查询文档
前言
全文搜索属于最常见的需求,开源的 Elasticsearch 是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、StackOverflow、Github 都采用它 Elastic 的底层是开源库 Lucene。但你没法直接用Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
一、基本概念
1.1 Index(索引)
动词,相当于 MySQL 中的 insert;
名词,相当于 MySQL 中的 Database
1.2 Type(类型)
在 Index(索引)中,可以定义一个或多个类型。
类似于 MySQL 中的 Table;每一种类型的数据放在一起;
1.3 Document(文档)
保存在某个索引(Index)下,某种类型(Type)的一个数据(Document),文档是 JSON 格式的,Document 就像是 MySQL 中的某个 Table 里面的内容。
1.4 ES与关系型数据库对比
在Elasticsearch中存储数据的行为就叫做索引(indexing),不过在索引之前,我们需要明确数据应该存储在哪里。
在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以简单的对比传统关系型数据库:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。
「索引」含义的区分
你可能已经注意到索引(index)这个词在Elasticsearch中有着不同的含义,所以有必要在此做一下区分:
索引(名词) 如上文所述,一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices 或indexes。
索引(动词) 「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的 INSERT 关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。
1.5 倒排索引
传统数据库为特定列增加一个索引,例如B-Tree索引来加速检索。
Elasticsearch和Lucene使用一种叫做倒排索引(inverted index)的数据结构来达到相同目的。
如上图所示:我们将1-红海行动(文档)索引到某个类型,Elasticsearch会将这个文档进行分词,将红海行动才分为红海和行动,如上表第一条记录:红海这个分词存在于1号记录,同理行动存在于1号记录里,以此类推,Elasticsearch将上述五条记录维护在上述表中,这就是倒排索引表。
当我们要检索红海特工行动的时候,Elasticsearch也会将检索的文档进行分词为:红海,特工,行动。红海1-5号记录都有,特工存在五号记录,行动存在于1-3号记录。3号记录三个分词命中了两个,5号记录4单词命中了两个,所以红海特工行动这条文档,3号记录相关性得分较高,检索3号记录排在前面。
二、初步检索
2.1 _cat
GET /_cat/nodes:查看所有节点
GET /_cat/health:查看 es 健康状况
GET /_cat/master:查看主节点
GET /_cat/indices:查看所有索引 show databases;
2.2 索引一个文档(保存)
2.2.1 保存一个数据,保存在哪个索引的哪个类型下(翻译成MySQL的话就是在某个数据库某张表中保存一条记录),指定用哪个唯一标识。
如PUT customer/external/1;在 customer 索引下的 external 类型下保存 1 号数据。
PUT customer/external/1
{
"name": "John Doe"
}
点击send,返回如上数据:_符号开头的叫元数据,“_index”: “customer"表面该文档存在customer索引中,”_type": “external”,表面该文档存在external类型下,“_id”: “1”,唯一标识,“_version”: 1,版本信息,“result”: “created”,第一次请求表示新建状态。
2.2.2 同样请求再次点击send,变成更新操作。
2.2.3 PUT 不带id报错
2.2.4 POST 发送请求
PUT和POST都可以,
POST新增,如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号。
PUT可以新增可以修改,PUT必须指定id,由于PUT需要指定id,我们一般都用来做修改操作,不指定id会报错。
2.3 查询文档
GET customer/external/1
{
"_index": "customer",//在哪个索引
"_type": "external",//在哪个类型
"_id": "1",//记录 id
"_version": 2,//版本号
"_seq_no": 1, //并发控制字段,每次更新就会+1,用来做乐观锁
"_primary_term": 1,//同上,主分片重新分配,如重启,就会变化
"found": true,
"_source": { //真正的内容
"name": "John Doe"
}
}