常见术语
文档 Document
- 用户存储在es中的数据文档,相当于mysql数据表中的一行数据
索引 index
- 由具有相同字段的文档列表组成,相当于mysql数据库中的表,table
节点 Node
- 一个elasticsearch 的运行实例,是集群的构成单元。
集群 Cluster
Document
Json Object,有字段(field)组成,常见数据类型如下:
- 字符串:text,keyword
- 数值型:long,integer,short,byte,double,float,scaled_float
- 布尔:Boolean
- 日期:date
- 二进制:binary
- 范围类型:integer_range,float_range,long_range,double_range,date_range
每个文档都有一个唯一的ID标识
元数据(MetaData),用于标注文档相关信息
- _index:文档所在索引名
- _type:文档所在的类型名
- _id:文档唯一id
- _uid:组合id,由_type和_id组成(6.x _type不再起作用,同_id一样)
- _source:文档的原始Json数据,可以从这里获取每个字段的内容
- _all:整合所有字段内容到该字段,默认禁用
正排索引

倒排索引
- 单词到文档ID的关联关系
倒排索引-查询流程
- 通过倒排索引获得"搜索引擎"对应的文档Id有1和3
- 通过正排索引查询1和3的完整内容
- 返回用户最终结果
倒排索引-单词词典
单词词典(Term Dictionary)是倒排索引的重要组成
- 记录所有文档的单词,一般都比较大
- 记录单词倒排列表的关联信息
倒排索引-倒排列表
倒排列表( Posting List )记录了单词对应的文档集合,由倒排索引项( Posting )组成
倒排索引项( Posting )主要包含如下信息:
- 文档Id ,用于获取原始信息
- 单词频率( TF, Term Frequency) , 记录该单词在该文档中的出现次数,用于后续相关性算分
- 位置( Position) ,记录单词在文档中的分词位置(多个) , 用于做词语搜索
- 偏移(Offset),记录单词在文档的开始和结束位置,用于做高亮显示
Index
索引中存储具有相同结构的文档(Document)
- 每个索引都有自己的mapping 定义,用于定义字段名和类型
一个集群可以有多个索引,比如:
- nginx 日志存储的时候可以按照日期每天生成一个索引来存储
nginx-log-2019-01-01
nginx-log-2019-01-02
nginx-log-2019-01-03
创建索引与写入数据
Rest API ()
Elasticsearch 集群对外提供RESTful API
- REST(REpresentational State Transfer)表现层状态转移(对资源进行操作状态会发生变化)
- URL指定资源,如Index,Document
- Http Method 指定资源操作类型,如GET,POST,PUT,DELETE
两种交互方式
- Curl 命令行

- Kibana DevTools

索引 API
es有专门的Index API,用于创建,更新,删除索引配置等
PUT /test_index

- 查看现有索引
GET_cat/indices

文档 Document API
es有专门的 Document API
创建文档:
指定文档ID创建文档:
PUT /test_index/doc/1
{
"username":"kibana",
"version":6.1
}

不指定ID创建文档:
POST /test1_index/doc
{
"username":"kibana",
"version":6.1
}

查询文档
批量创建文档API
es允许一次操作多个文档(增删改查,create创建文档,如果文档已经存在就会报错。index创建文档,如果存在就会覆盖。)
- endpoint 为 _bulk,如下:
POST _bulk
{"index":{"_index":"test_index","_type":"doc","_id":"3"}}
{"username":"zabbix","version":4}
{"delete":{"_index":"test_index","_type":"doc","_id":"1"}}
{"update":{"_id":"4","_index":"test_index","_type":"doc"}}
{"doc":{"es":"5.0"}}
输出:
{
"took": 979, //查询耗时,单位ms
"errors": false, //返回结果,正确或错误
"items": [ //每个操作返回的结果
{
"index": {
"_index": "test_index",
"_type": "doc",
"_id": "3",
"_version": 1,
"result": "created", //创建
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1,
"status": 201
}
},
{
"delete": {
"_index": "test_index",
"_type": "doc",
"_id": "1",
"_version": 2,
"result": "deleted", //删除
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1,
"status": 200
}
},
{
"update": {
"_index": "test_index",
"_type": "doc",
"_id": "4",
"_version": 2,
"result": "updated", //更改
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1,
"status": 200
}
}
]
}
批量查询文档
- endpoint 为_mget,如下:(并且可以在一个_mget下获取不同索引的文档)
GET /_mget //查找在test_index索引,id为4和1的文档.
{
"docs":[ //指明要查询的文档id
{
"_index":"test_index",
"_type":"doc",
"_id":"4"
},
{
"_index":"test_index",
"_type":"doc",
"_id":"2"
}
]
}
返回
{
"docs": [
{
"_index": "test_index",
"_type": "doc",
"_id": "4",
"_version": 2,
"found": true,
"_source": {
"username": "es",
"version": 6.1,
"es": "5.0"
}
},
{
"_index": "test_index",
"_type": "doc",
"_id": "2",
"_version": 1,
"found": true,
"_source": {
"username": "zabbix",
"version": 4.2
}
}
]
}
欢迎加入
