ElaticSearch 基本概念
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口(个人理解为基于RESTful风格的索引数据库)
接近实时(NRT Near Real Time )
Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒内)
索引(index)
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。索引类似于关系型数据库中Database 的概念。在一个集群中,如果你想,可以定义任意多的索引。
类型(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。类型类似于关系型数据库中Table的概念。
NOTE: 在5.x版本以前可以在一个索引中定义多个类型,6.x之后版本也可以使用,但是不推荐,在7~8.x版本中彻底移除一个索引中创建多个类型
映射(Mapping)
Mapping是ES中的一个很重要的内容,它类似于传统关系型数据中table的schema,用于定义一个索引(index)中的类型(type)的数据的结构。 在ES中,我们可以手动创建type(相当于table)和mapping(相关与schema),也可以采用默认创建方式。在默认配置下,ES可以根据插入的数据自动地创建type及其mapping。 mapping中主要包括字段名、字段数据类型和字段索引类型
文档(document)
一个文档是一个可被索引的基础信息单元,类似于表中的一条记录。比如,你可以拥有某一个员工的文档,也可以拥有某个商品的一个文档。文档以采用了轻量级的数据交换格式JSON(Javascript Object Notation)来表示。
ElaticSearch 概念关系结构图
Kibana 基本操作
Kibana是一个针对Elasticsearch的开源分析及可视化平台,使用Kibana可以查询、查看并与存储在ES索引的数据进行交互操作,使用Kibana能执行高级的数据分析,并能以图表、表格和地图的形式查看数据。
(先启动ES服务,在启动Kibana)
索引(index)基本操作
创建索引时,把类型和映射一并创建
#创建索引
PUT /wyc
#查看所有索引
GET /_cat/indices?v
#删除索引
DELETE /wyc
#删除所有索引 [慎用:ElasticSearch会自带两个索引如果删除kibana客户端将不能使用,只有重启]
DELETE /*
类型(type)基本操作
创建类型
注意: 这种方式创建类型要求索引不能存在
#类型操作 一个索引里只能存在一个类型
PUT /ems
{
"mappings": {
"emp":{
"properties":{
"id":{"type":"integer"},
"name":{"type":"text"}
}
}
}
}
/ems:即创建的索引名字
“mappimgs”:映射,固定写法,即对类型的数据结构进行约束,这样在添加文档时,就会有约束
“emp”:即类型名,ES6之后建议一个索引创建一个类型
“properties”:属性,固定写法,即将类型所要创建的属性添加在里面
“id” “name”…等:属性名
“type”:固定写法,约束类型,可以根据属性的不同写不同类型
Mapping Type: text , keyword , date ,integer, long , double , boolean or ip
查看类型
# 语法
GET /索引名/_mapping
# 比如
GET /ems/_mapping
文档(document)基本操作
添加文档
如果不指定id,ES默认会生成一个随机id,后面操作文档都根据此id
这也是为什么在给类型添加属性时,一般不添加id属性
# 语法 PUT /索引/类型/id
PUT /ems/emp/1
{
"eid":2021326,
"name":"测试ES"
}
#不指定ID
POST /ems/emp
获取文档
# 语法 GET /索引/类型/id
GET /ems/emp/1
结果:
{
"_index" : "ems",
"_type" : "emp",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"eid" : 2021326,
"name" : "测试ES"
}
}
删除文档
# 语法 DELETE /索引/类型/id
DELETE /ems/emp/1
结果:
{
"_index" : "ems",
"_type" : "emp",
"_id" : "1",
"_version" : 2,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
更新文档
- 不保留原始数据(先删除后插入)
POST /ems/emp/1
{
"name":"张三"
}
- 保留原始数据更新,且可添加新字段
这种方式,type并没有新增的属性,但你添加的时候,ES会给你进行相应的匹配
POST /索引/类型/id/_update
{
"doc":{
"属性名":"值"
}
}
POST /ems/emp/1/_update
{
"doc":{
"eid":555555,
"name":"tetetetest"
}
}
结果:
{
"_index" : "ems",
"_type" : "emp",
"_id" : "1",
"_version" : 2,
"_seq_no" : 5,
"_primary_term" : 1,
"found" : true,
"_source" : {
"eid" : 555555,
"name" : "tetetetest"
}
}
- 根据script脚本进行更新[使用较少]
POST /ems/emp/1/_update
{
"script": "ctx._source.eid += 8888"
}
批量操作
有时候,想要同时添加文档、删除文档、修改文档、索引文档组合进行
使用关键词 _bulk
# 同时索引两个文档
PUT /ems/emp/_bulk
{"index":{"_id": "2"}}
{ "eid":"12456", "name":"nametetete"}
{"index":{"_id": "3"}}
{ "eid":"12456", "name":"name33"}
# 同时修改和删除文档
PUT /ems/emp/_bulk
{"update":{"_id":"3"}}
{"doc":{"name":"修改后name"}}
{"delete":{"_id":"2"}}
操作非原子性的,且弱化了事务