ES是一个分布式文档的非关系型数据库(文档类似于关系型数据库中的单条记录),文档的每个字段默认会被索引,每个字段的数据均可被搜索,能够横向扩展至数以百计的服务器存储以及处理PB级的数据。ES基于Restful Api接口,可通过Restful Api与ES进行交互。
使用案例:
- es可作为博客系统的数据库,文章等内容储存到es中,可根据文章内容进行快速检索当关系型数据库中数据量特别大查询慢时,可将大量数据导入es中,查询走es部署大规模的日志框架、logstash采集日志,es存储、搜索和分析海量的事件,kibana可视化查看结果;ELK技术,elasticsearch+logstash+kibana
es官方指南
快速启动项目在Windows环境下,下载es与Kibana,Kibana是一个开源的分析与可视化平台,可通过kibana的Dev Tool与es的数据进行CURD,kibana版本和es版本同步更新,所以两者最好使用一致的版本,下载地址:es下载,kibana下载
下载后解压各自的压缩包,在cmd中运行各自压缩包下bin目录下的.bat文件即可;es默认端口号9200,kibana默认端口号5601,访问localhost:5601进入kibana
概念索引 index:一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。
类型:类似传统关系数据库中的表,在es旧版本当中一个索引库中可包含多个类型,在es的索引中,不同的映射类型中存在相同的属性名,他们底层都是使用同一个Lucene属性,由于在同一个索引库不同类型中字段比较少或没有,会影响es的查询效率,所以后续在 es6.0.0 版本中一个文档只能包含一个类型,而在 7.0.0 中,类型则将被弃用,到了 8.0.0 中则将完全删除。7.x中的类型默认为_doc
文档:相当于关系型数据库的单条记录
字段:相当于关系型数据库中的 columns 列
倒排索引:关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。在es中,一个文档中的每一个属性默认被创建了倒排索引。一个没有倒排索引的属性是不能被搜索到的。 es查询为什么快?
倒排索引操作步骤:
- 先将文档中包含的关键字全部提取出来然后再将关键字与文档的对应关系保存起来最后对关键字本身做索引排序。
这样在用户检索关键字时, 可以先查找关键字索引,在通过关键字与文档的对应关系查找到所在的文档。
如下面的三个文档:
| id | age | sex | name |
|---|---|---|---|
| 1 | 18 | female | 北大 |
| 2 | 20 | male | 河北大学青年 |
| 3 | 18 | male | 爱国青年 |
包含指定关键字的文档:
| 序号 | 关键字 | 包含文档 |
|---|---|---|
| 1 | 北大 | 1,2 |
| 2 | 河北 | 2 |
| 3 | 大学 | 2 |
| 4 | 青年 | 2,3 |
| 5 | 爱国 | 3 |
| 6 | 18 | 1,3 |
| 7 | 20 | 2 |
| 8 | male | 2,3 |
| 9 | female | 1 |
根据关键字查询,可直接检索出结果文档
RestApi| method | url | 描述 |
|---|---|---|
| PUT | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
| POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
| POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
| DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
| GET | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档id |
| POST | localhost:9200/索引名称/类型名称/_search | 查询所有数据 |
- 字符串类型: text, keyword数字类型:long, integer, short, byte, double, float, half_float, scaled_float日期:date日期 纳秒:date_nanos布尔型:booleanBinary:binaryRange: integer_range, float_range, long_range, double_range, date_range
分片分为主分片与复制分片
分片类似与mysql中的分库分表,es在创建索引库时可设置创建几个主分片与复制分片,默认情况下,一个索引被分配 5 个主分片,一个主分片有一个复制分片,每个文档存储在独立的主分片中,插入一个文档时,会根据文档的_id(唯一id)决定该文档存储在哪个主分片中;
复制分片只是主分片的一个副本,它可以防止硬件故障导致的数据丢失,同时可以提供读请求,比如搜索或者从别的分片取回文档。主分片或者复制分片都可以处理读请求——搜索或文档检索,所以数据的冗余越多,能处理的搜索吞吐量就越大。
es深入分片
举例更全面的用kibana查询es数据教程
聚合查询
// 创建一个商品索引库,不指定类型,类型默认
PUT goods
{
// mappings 就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。
"mappings": {
"properties": {
"goodsId": {
"type": "integer"
},
// 设置goodsName类型为text用于全文检索,同时类型又为keyword用于关键词搜索
// keyword类型的字段默认会排序,取数据时会直接根据顺序输出,查询效率高
"goodsName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
// 索引最大的字段值长度,超出部分不会被索引且存储
"ignore_above": 256
}
}
},
"createTime": {
"type": "date"
}
}
}
}
// 插入一条商品数据,不指定id
POST goods/_doc
{
"goodsId":1,
"goodsName":"商品1",
"createTime":"1643178793939"
}
// 查询所有数据
GET goods/_search
// 结果:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2, // 共两条数据
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "goods",
"_type" : "_doc",
"_id" : "vhqYlX4BFS2tMwa2XXMK",
"_score" : 1.0,
"_source" : {
"goodsId" : 1,
"goodsName" : "商品1",
"createTime" : "1643178793939"
}
},
{
"_index" : "goods",
"_type" : "_doc",
"_id" : "wRqYlX4BFS2tMwa2dXO9",
"_score" : 1.0,
"_source" : {
"goodsId" : 2,
"goodsName" : "商品2",
"createTime" : "1643178793939"
}
}
]
}
}
// 根据goodsId条件查询
GET goods/_search
{
"query": {
"match": {
"goodsId": 1
}
}
}
// 结果:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "goods",
"_type" : "_doc",
"_id" : "vhqYlX4BFS2tMwa2XXMK",
"_score" : 1.0,
"_source" : {
"goodsId" : 1,
"goodsName" : "商品1",
"createTime" : "1643178793939"
}
}
]
}
}



