目录
前言
这篇文章是个人在es学习过程中从0-1记录的,非常适合于刚入门的小伙伴,文章涵盖了es和kibana的安装、es基本概念、基础操作、整合SpringBoot、集群等。记录之初是为了加深学习印象。文中包含个人理解如有错误欢迎指出~
1.ElasticSearch
1.安装、解压
我是macos系统,本次安装使用传统tar包方式安装,下载地址:Elasticsearch 7.14.0 | Elastic
elasticsearch要求jdk是11及以上,没有该版本最好安装一下(虽然elasticsearch自带默认jdk)
下载tar包完成后,可以把它移动到自定义目录进行解压。
tar -zxvf elasticsearch-7.14.0-darwin-x86_64.tar.gz
2.目录介绍
待补充。。
3.启动
进入到安装目录的bin目录下,执行elasticsearch(执行./elasticsearch -d 是后台启动)
v_x@v-xeMacBook-Pro elasticsearch-7.14.0 % cd bin
v_x@v-xeMacBook-Pro bin % ls
elasticsearch elasticsearch-env-from-file elasticsearch-saml-metadata elasticsearch-syskeygen
elasticsearch-certgen elasticsearch-geoip elasticsearch-service-tokens elasticsearch-users
elasticsearch-certutil elasticsearch-keystore elasticsearch-setup-passwords x-pack-env
elasticsearch-cli elasticsearch-migrate elasticsearch-shard x-pack-security-env
elasticsearch-croneval elasticsearch-node elasticsearch-sql-cli x-pack-watcher-env
elasticsearch-env elasticsearch-plugin elasticsearch-sql-cli-7.14.0.jar
v_x@v-xeMacBook-Pro bin % ./elasticsearch
如果在日志中看到以下信息,说明启动成功。
默认端口是9200,tcp端口是9300。
打开另一个终端窗口,执行ps -ef |grep elasticsearch 查看进程是否启动。
执行curl http://localhost:9200,出现以下内容,连接成功
启动后的es不允许远程连接,需要修改/config/elasticsearch.yml
再次启动,但发现如下错误(注意:不同系统可能出现不同错误)
这个错误是说,如果允许远程连接,es是默认集群启动,需要去修改配置,当前我只想单机启动。修改/config/elasticsearch.yml
2.Kibana
Kibana 是一个针对Elasticsearch 的开源分析及可视化平台,使用Kibana可以 查询、查看并与存储在ES索引的数据进行交互操作,使用Kibana能执行高级的数据分析,并能以图表、表格和地图的形式查看数据。Kibana与Elasticsearch的关系可以理解为Navicat与Mysql。
1.安装、解压、启动
下载
安装
tar -zxvf kibana-7.14.0-darwin-x86_64.tar.gz
修改kibana配置文件 /config/kibana.yml
修改如下配置
server.host: "0.0.0.0" # 开启kibana远程访问
elasticsearch.hosts: ["http://localhost:9200"] #ES服务器地址
启动kibana
./bin/kibana
我这里在启动过程中出现一个错误,是因为配置文件中localhost多打了一个s。。
修改后,正常启动
访问 http://localhost:5601/,出现以下画面,连接成功。
通过侧边栏找到 dev tools
发送请求,能拿到响应结果说明所有安装、配置都是正确的
3.三个核心概念
ES6有一个 类型 的概念,在7中移除。
1.索引(Index)
"一个索引就是一个拥有几分相似特征的文档的集合"。比如说,你可以有一个商品数据的索引,一个订单数据的索引,还有一个用户数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。可以简单理解为 es中的索引类似于mysql中的表,一个索引就是一张表。
2.映射(Mapping)
"映射是定义一个文档和它所包含的字段如何被存储和索引的过程",在默认配置下,ES可以根据插入的数据 自动地创建mapping,也可以手动创建mapping。mapping中主要包括字段名,字段类型等。可以简单理解为 es中的映射类似于mysql表的schema,es中不需要指定字段长度。
3.文档(Document)
"文档是索引中存储的一条条数据"。一条文档是一个可被索引的最小单元 。ES中的文档采用了轻量级的JSON格式数据来表示。可以简单理解为 es索引中的一个文档类似于mysql表的一条数据。
4.基本操作
1.索引
索引在es中只能创建、删除,不能修改
查询
# 查询es所有索引
get /_cat/indices
# 查询es所有索引,显示title
get /_cat/indices?v
# health:健康状态,氛围red,green,yellow,如果是red状态,代表不可用
# status:状态,默认是开启的
# index:索引,.开头的都是临时索引,是不可见的,是kibana连接es时需要用到的,每次启动可能都不一样
# uuid:索引的唯一标识
# pri:primary缩写,代表索引主分片
# rep:replica缩写,代表副本分片
# docs.count:文档数
# docs.deleted:删除
# store.size:存储大小
# pri.store.size:主分片索引大小或主索引大小
创建
不指定配置创建(yellow)
# PUT /索引名
PUT /products
索引创建成功,但健康状态是yellow,因为es在创建索引时,默认会备份,但当前是单机部署,所以主分片和从分片都是同一台机器,如果机器宕机,主从数据都会丢失,那么备份就失去意义,所以状态是yellow。
指定配置创建(green)
# PUT /索引名
# 指定主分片数量为1,副本为0,这样创建的index健康状态是green
PUT /orders
{
"settings": {
"number_of_shards": 1,
"number_of_replicas":0
}
}
删除
# DELETE /索引名
DELETE /products
2.映射
映射脱离索引是没有意义的,所以创建过程中要创建索引。
映射是无法修改的,如果映射写错了,就要删除索引重新创建。
创建索引&映射
es有丰富的数据类型,举几个例子:
- 字符串类型:keyword 关键字、text 文本
- 数字类型:integer、long
- 小数类型:float、double
- 布尔类型:boolean
- 日期类型:date
在es中,除了text 分词,其余类型均不分词
PUT /products
{
"settings": {
"number_of_shards": 1,
"number_of_replicas":0
}
, "mappings": {
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "text"
},
"price": {
"type": "double"
},
"create_at": {
"type": "date"
},
"description": {
"type": "keyword"
}
}
}
}
查询映射信息
# GET /索引名/_mapping
GET /products/_mapping
3.文档
添加文档&查询
# 指定文档id
POST /products/_doc/1
{
"id" : 1,
"title": "蘑古力",
"price": 3.5,
"description": "好吃"
}
# 不指定文档id,自动使用uuid
POST /products/_doc
{
"title": "可比克",
"price": 2.5,
"description": "也好吃"
}
添加成功
基于id查询
删除文档
# 指定文档id
DELETE /products/_doc/1
更新文档
方式一
使用PUT
# 指定文档id,json是要更新的内容
PUT /products/_doc/1
{
"title": "蘑古力力"
}
更新成功后再查询一次,发现的确更新了,但其他字段没有了
所以这种更新方式,是先删除原文档,再添加新文档
方式二
使用POST
# 指定文档id和字段更新,其余字段保持不变
# doc是指定写死的
POST /products/_doc/UqXXRZQBojmWc6Ssvexl/_update
{
"doc": {
"title" : "呀土豆"
}
}
查看一下更新结果,发现只有指定的字段更新
这种更新方式,不会删除原文档,会根据指定字段更新
批量操作
批量添加文档
注意:json格式必须写在一行,不然执行出错
# 文档批量操作
POST /products/_doc/_bulk
{"index":{"_id":3}}
{"id":3,"title": "呀土豆3","price": 2.5,"description": "也好吃3"}
{"index":{"_id":4}}
{"id":4,"title": "呀土豆4","price": 2.5,"description": "也好吃4"}
{"index":{"_id":5}}
{"id":5,"title": "呀土豆5","price": 2.5,"description": "也好吃5"}
成功添加多个文档
添加、更新、删除
POST /products/_doc/_bulk
{"index":{"_id":6}}
{"id":6,"title": "炫迈","price": 10.5,"description": "挺好吃"}
{"update":{"_id":4}}
{"doc": {"title": "呀土豆4update"}}
{"delete":{"_id":5}}
执行结果:新增id 6,更新id 4,删除id 5
注意:批量操作时不会因为一个失败而全部失败,而是继续执行后面的操作,在返回时按照执行的状态返回
5.高级查询 DSL
- 说明:ES中提供了一种强大的检索数据方式,这种检索方式称之为 Query DSL<DomainQuery DSL是利用 Rest API传递JSON格式的请求体(RequestSpecified Language>,Body)数据与ES进行交互,这种方式的 丰富查询语法 让ES检索变得 更强大,更简洁。
- 语法:
# 加_doc时在kibana中没有提示 # GET /索引名/_doc/_search {json格式请求提数据} # 不加_doc时在kibana中有提示 # GET /索引名/_search {json格式请求提数据} # 两种方式执行结果是一样的
查询所有[match all]
# 查询所有
GET /products/_search
{
"query": {
"match_all": {}
}
}
查询结果
{
"took" : 14,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 6,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "products",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "蘑古力力"
}
},
{
"_index" : "products",
"_type" : "_doc",
"_id" : "UqXXRZQBojmWc6Ssvexl",
"_score" : 1.0,
"_source" : {
"title" : "呀土豆",
"price" : 2.5,
"description" : "也好吃"
}
},
{
"_index" : "products",
"_type" : &