Elasticsearch学习第一篇--Elasticsearch初认知

最近开始学习Elasticsearch,作为Elk Stack (Elasticsearch、Logstash、Kibana)的核心,优先学习,贯穿学习Logstash、Kibana的使用。因为工作项目使用的6.3版本,我这边也是学习6.3;目前最新已是7.x 。

ElasticSearch 基本概念

定义:基于 Apache Lucene 的开源搜索引擎

核心概念:

  • lucene

功能强大的搜索库,但比较复杂,elasticSearch基于lucene,提供了简单易用的restful api接口、java api接口等。

  • Node 与 Cluster

Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。

单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。

  • Index

索引是具有某种相似特征的文档的集合。索引有一个名称标识,该名称用于在对其中的文档执行索引、搜索、更新和删除操作时引用索引。

Elastic 会索引所有字段,经过处理后写入一个倒排索引(Inverted Index)。查找数据的时候,直接查找该索引。

所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

其实还有一个type;1个索引可以有1至多个type;

比如建立了一个索引是博客;  然后又可以细分博客内容type,博客评论type等;貌似7.x 取消了type。

  • Document

文档是可以被索引的基本信息单元。文档用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.

  • NLK 近实时

写入ES到读取近实时;

搜索和分析可以达到秒级,近实时

ES数据架构的主要概念(与关系数据库Mysql对比)

è¿éåå¾çæè¿°

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

 ES特点和优势

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 

Elasticsearch学习第一篇--Elasticsearch初认知_第1张图片

如图:

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

Elasticsearch学习第一篇--Elasticsearch初认知_第2张图片

 

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/

 

你可能感兴趣的:(elasticsearch,elk,Elastic,Stack)