最近开始学习Elasticsearch,作为Elk Stack (Elasticsearch、Logstash、Kibana)的核心,优先学习,贯穿学习Logstash、Kibana的使用。因为工作项目使用的6.3版本,我这边也是学习6.3;目前最新已是7.x 。
ElasticSearch 基本概念
定义:基于 Apache Lucene 的开源搜索引擎
核心概念:
功能强大的搜索库,但比较复杂,elasticSearch基于lucene,提供了简单易用的restful api接口、java api接口等。
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
索引是具有某种相似特征的文档的集合。索引有一个名称标识,该名称用于在对其中的文档执行索引、搜索、更新和删除操作时引用索引。
Elastic 会索引所有字段,经过处理后写入一个倒排索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
其实还有一个type;1个索引可以有1至多个type;
比如建立了一个索引是博客; 然后又可以细分博客内容type,博客评论type等;貌似7.x 取消了type。
文档是可以被索引的基本信息单元。文档用JSON表示。 可以理解为java的对象。
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。
当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,可以将一个索引的数据可以分为较小的shard,分布在多台服务器上存储。 从而实现横向拓展,让搜索和分析等操作分布到多台服务器上执行,提高吞吐量和性能。这时候每个shard都是一个lucene index。所以一般一个index包含多个shard。
增减节点时,shard 会自动在nodes中负载均衡,使用者不用关注负载均衡问题,很方便扩容。
当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的shard,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。
分片有两种:Primary Shard 主分片 和Replica shard:副本分片
为提高查询吞吐量或实现高可用性,可以使用分片副本。Replica shard是一个Primary Shard的精确复制,每个Primary Shard可以有零个或多个Replica shard。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。
当主分片丢失时,如:该分片所在的数据不可用时,集群将Replica shard提升为新的Primary Shard(白话点就是ES的容灾机制),比较特殊的是replica shard 也会承担读请求负载。
所以呢,主分片和副本分片不要放到一个节点上,不然节点挂掉,副本分片也是用不了,没有任何意义。
主分片的数量在创建索引的时候就固定了,但Replica shard的数量可以随时修改。
全文检索就是对一篇文章进行索引,可以根据关键字搜索,类似于mysql里的like语句。
中文检索较复杂,常用到分词器,比IK.
写入ES到读取近实时;
搜索和分析可以达到秒级,近实时
1)关系型数据库中的数据库(DataBase),等价于ES中的索引(Index)
2)一个数据库下面有N张表(Table),等价于1个索引 Index下面有N多类型(Type),
3)一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成。
4)在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。 与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。
5)在数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT、删Delete、改POST、查GET.
此关系引自:https://blog.csdn.net/roshy/article/details/89307570
1)分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
2)实时分析的分布式搜索引擎。
分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作; 负载再平衡和路由在大多数情况下自动完成。
3)可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。也可以运行在单台PC上(已测试)
4)支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。
ES安装
开箱即用,比较方便
https://www.elastic.co/cn/官网下载 es 和kibana, 解压后到目录执行bin\elasticsearch.bat即可。
默认端口9200 ,默认集群名称my-application; 如需要修改,可以到ES的解压目录config下 修改elasticsearch.yml
检查ES是否启动成功:http://localhost:9200
如图:
name: node名称
cluster_name: 集群名称(默认的集群名称就是elasticsearch)
version.number: 6.3.2,es版本号
kibana安装(ES的看板)
也是开箱即用,解压后启动Kibana:bin\kibana.bat
默认端口5601,可去kibana解压包conf下修改kibana.yml
验证启动:http://localhost:5601
kibana看板的一些简单操作
(1)快速检查集群的健康状况
GET /_cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1591689514 15:58:34 simon green 1 1 1 1 0 0 0 0 - 100.0%
status :green、yellow、red
green:每个索引的primary shard和replica shard都是active状态的
yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了
这里显示的是yellow ,因为我自己PC只启动了一个es,相当于就只有一个node.
由于默认的配置是给每个index分配5个primary shard和5个replica shard,而且primary shard和replica shard不能在同一台机器上(为了容错)。现在kibana自己建立的index是1个primary shard和1个replica shard。当前就一个node,所以只有1个primary shard被分配了和启动了,但是一个replica shard没有第二台机器去启动。
(2)快速查看集群中有哪些索引
GET /_cat/indices?v
(3)简单的索引操作
创建索引:
PUT /test_index
删除索引:
DELETE /test_index
(4)建立索引后的简单CRUD操作
新增
put test_index/base/1
{
"name":"xiaoming",
"age":18,
"sex":"M"
}
这时候去查询
get test_index/base/1
查的结果:
{
"_index": "test_index",
"_type": "base",
"_id": "1",
"_version": 2,
"found": true,
"_source": {
"name": "xiaoming",
"age": 18,
"sex": "M"
}
}
修改
修改方式1:可以增量修改
POST /test_index/base/1/_update
{
"doc": {
"age": 20
}
}
再次查询
{
"_index": "test_index",
"_type": "base",
"_id": "1",
"_version": 2,
"found": true,
"_source": {
"name": "xiaoming",
"age": 20,
"sex":"M"
}
}
修改方式2:这种方式会覆盖;PUT或POST都可以
post test_index/base/1
{
"age":30
}
再次查询
{
"_index": "test_index",
"_type": "base",
"_id": "1",
"_version": 2,
"found": true,
"_source": {
"age": 30
}
}
删除
DELETE /test_index/base/1/