【无标题】

Elasticsearch学习笔记

1、Elasticsearch的介绍

Elasticsearch 是一个分布式的开源搜索和分析引擎,在 Apache Lucene 的基础上开发而成,Lucene采用了次元匹配方案。Elasticsearch 对外提供restful接口。

2、原理与应用

2.1.索引结构

在这里插入图片描述

如图所示:

2.1.1.首先我们需要了解下Elasticsearch的逻辑结构
1、Document

Elasticsearch 是面向文档的,这意味着索引和搜索数据的最小单位是文档

一个文档通常是以json的数据格式来表示的。例如:

{
"name":"Elasticsearch技术峰会",
"organizer":"冰河",
"location ":"中国, 浙江,杭州"
}

结合上图,一个Document中有很多字段,一个field就是一个字段,如上“name”,“organizer”,“location”这些都是字段。

2、type

类型,是文档的逻辑容器,类似于表格是行的容器。在不同的类型中,最好放入不同结构的文档。每个类型中字段(Field)的定义称为映射(Mapping)。例如, 一个人的姓名可以映射为string,年龄可以映射为int。映射包含某个类型中当前索引的所有文档的所有字段,但不是所有的文档必须要有所有的字段。

3、index

索引,是类型的容器。一个Elasticsearch 索引非常像关系型数据库,是独立的大量文档集合。

4、与关系型数据库的类比

需要特别注意的是:ES 6以前每个Index可以有多个Type,在ES 6中一个Index仅能包含一个Type,而在ES 7将完全移除Type

为什么要移除Type呢?

我们一直拿ES与关系数据库作类比,说"索引"和关系数据库的“库”是相似的,“类型”和“表”是对等的。实际上这是一个不太准确的对比。在关系型数据库里,"表"是相互独立的,一个“表”里的列和另外一个“表”的同名列没有关系,互不影响。

但在ES的中不是这样的。在同一个Index下,不管有多少个Type,底层共用一个Lucene实例,也就是说,所有Type的同名字段在内部使用的是同一个Lucene字段存储,这就要求同名字段必须属于同一种数据类型。

这可能导致一些问题,例如同一个索引下,有两个结构不同的Type,都拥有一个名为"deleted"字段,但是如果期望的在一个Type里是存储日期值,在另外一个Type里存储布尔值,是做不到的。

还有一个更重要的原因,在同一个索引中,存储仅有小部分字段相同或者全部字段都不相同的文档,会导致数据稀疏,影响Lucene有效压缩数据的能力。

2.1.2.Elasticsearch的物理结构
1、Node

一个节点是一个ES的实例,在服务器上启动ES之后,就拥有了一个节点,如果在另一个服务器上启动ES,这就是另一个节点。甚至可以在一台服务器上启动多个ES进程,在一台服务器上拥有多个节点。多个节点可以加入同一个集群。

2、shard

Elasticsearch提供了将索引分化成多份的功能,这些份就叫做分片。

当创建一个索引时,可以指定分片数量(number_of_shards)。

在这里插入图片描述

每个分片本身也是一个功能完善并且独 立的Lucene“索引”,这个“索引”可以被放置到集群中的任何节点上。

基于每个节点的高可用性,备份非常需要的。所以Elasticsearch允许创建分片的一份或多份拷贝。此时索引中就包含了主分片和复制分片。上图中创建索引时就对每个分片进行了一个备份(number_of_replicas是备份的数量)。

默认情况下,Elasticsearch每个索引会被分为5个分片和一个备份,这意味着一个索引就有10个分片(包含备份)。

了解了这些,我们再看索引结构就很清晰了。

2.2.倒排索引

倒排索引(Inverted index):也常被称为反向索引,倒排索引是从关键字到文档的映射(已知关键字求文档)。

逻辑结构部分是一个倒排索引表,由三部分组成:

1、将搜索的文档以Document方式存储起来。

2、将要搜索的文档内容分词,所有不重复的词组成分词列表。

3、每个分词和docment都有关联。

3、安装Elasticsearch

3.1.环境需求

1、jdk必须是jdk1.8.0_131以上版本。

2、ElasticSearch 需要至少4096 的线程池和 262144字节以上空间的虚拟内存才能正常启动,所以需要为虚拟机分配至少1.5G以上的内存

3、从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动

4、Elasticsearch的插件要求至少centos的内核要3.5以上版本

3.2.在虚拟机上安装ES
1、下载

ElasticSearch官网:https://www.elastic.co/cn/

2、设置虚拟机内存

在这里插入图片描述

3、创建用户

从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动,所以我们要添加一个用户。

1、创建elk用户组
groupadd elk
2、创建admin用户
useradd admin
passwd admin
3、将admin添加到elk用户组
usermod -G elk admin
4、为用户分配权限
#chown将指定文件的拥有者改为指定的用户或组 -R处理指定目录以及其子目录下的所有文件
chown -R admin:elk /usr/upload
chown -R admin:elk /usr/local

切换用户:

su admin
4、安装

ES是java开发的应用,只要有jdk环境,解压即安装

tar -zxvf elasticsearch-6.2.3.tar.gz -C /usr/local
5、ES安装后的目录结构
bin 目录:可执行文件包
config 目录:配置相关目录
lib 目录:ES 需要依赖的 jar 包,ES 自开发的 jar 包
logs 目录:日志文件相关目录
modules 目录:功能模块的存放目录,如aggs、reindex、geoip、xpack、eval
plugins 目录:插件目录包,三方插件或自主开发插件
data 目录:在 ES 启动后,会自动创建的目录,内部保存 ES 运行过程中需要保存的数据。

在这里插入图片描述

3.3.配置文件

ES安装目录config中配置文件如下:

​ elasticsearch.yml:用于配置Elasticsearch运行参数

​ jvm.options:用于配置Elasticsearch JVM设置

​ log4j2.properties:用于配置Elasticsearch日志

1、elasticsearch.yml
vim /usr/loacl/elasticsearch-6.2.3/config/elasticsearch.yml

此文件配置如下:

cluster.name: lyf           
node.name: lyf_1            
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
path.data: /usr/local/elasticsearch-6.2.3/data
path.logs: /usr/local/elasticsearch-6.2.3/logs
http.cors.enabled: true
http.cors.allow-origin: /.*/

注意意path.data和path.logs路径配置正确。

常用的配置项如下:

cluster.name:
       配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。   
node.name:
      节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理一个或多个节点组成一个cluster集群,集群是一个逻辑的概念,节点是物理概念,后边章节会详细介绍。
path.data:
       设置索引数据的存储路径,默认是es_home下的data文件夹,可以设置多个存储路径,用逗号隔开。      
path.logs:
       设置日志文件的存储路径,默认是es_home下的logs文件夹         
network.host:  
       设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体的ip。   
http.port: 9200
       设置对外服务的http端口,默认为9200。      
transport.tcp.port: 9300 
       集群结点之间通信端口      
discovery.zen.ping.unicast.hosts:[“host1:port”, “host2:port”, “…”]  
       设置集群中master节点的初始列表。
discovery.zen.ping.timeout: 3s  
       设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些。
http.cors.enabled:
	   是否支持跨域,默认为false
http.cors.allow-origin:
	   当设置允许跨域,默认为*,表示支持所有域名
2、jvm.options

设置最小及最大的JVM堆内存大小:

在jvm.options中设置 -Xms和-Xmx:

1) 两个值设置为相等

2) 将Xmx 设置为不超过物理内存的一半。

我这里虚拟机给了2G内存,为了防止Elasticsearch启动不了,我们调小一些:

-Xms512m
-Xmx512m
3、log4j2.properties

日志文件设置,ES使用log4j,注意日志级别的配置。

3.4.启动Elasticsearch
1、启动和关闭
1、启动
./elasticsearch
#或
./elasticsearch -d   
2、关闭

因为Elasticsearch没有提供关闭脚本,只能通过杀进程来关闭

ps-ef|grep elasticsearch

kill -9 pid
2、解决内核问题

我们使用的是centos6,其linux内核版本为2.6。而Elasticsearch的插件要求至少3.5以上版本。不过没关系,我们禁用这个插件即可。

修改elasticsearch.yml文件,在最下面添加如下配置:

bootstrap.system_call_filter: false
3、解决文件创建权限问题
[1]: max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

Linux 默认来说,一般限制应用最多创建的文件是 4096个。但是 ES 至少需要 65536 的文件创建权限。我们用的是admin用户,而不是root,所以文件权限不足。

使用root用户修改配置文件:

vim /etc/security/limits.conf

追加下面的内容:

* soft nofile 65536
* hard nofile 65536
4、解决线程开启限制问题
[2]: max number of threads [1024] for user [admin] is too low, increase to at least [4096]

​ 默认的 Linux 限制 root 用户开启的进程可以开启任意数量的线程,其他用户开启的进程可以开启1024 个线程。必须修改限制数为4096+。因为 ES 至少需要 4096 的线程池预备。

​ 如果虚拟机的内存是 1G,最多只能开启 3000+个线程数。至少为虚拟机分配 1.5G 以上的内存。

使用root用户修改配置:

vim /etc/security/limits.d/90-nproc.conf

修改下面的内容:

* soft nproc 1024

改为:

* soft nproc 4096
5、解决虚拟内存问题
[3]: max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

ES 需要开辟一个 262144字节以上空间的虚拟内存。Linux 默认不允许任何用户和应用直接开辟虚拟内存。

vim /etc/sysctl.conf

追加下面内容:

vm.max_map_count=655360 #限制一个进程可以拥有的VMA(虚拟内存区域)的数量

然后执行命令,让sysctl.conf配置生效:

sysctl -p

4.安装Kibana和head

4.1.什么是Kibana

​ Kibana是ES提供的一个基于Node.js的管理控制台, 可以很容易实现高级的数据分析和可视化,以图标的形式展现出来。

​ kibana可以用来编辑请求语句的,方便学习操作es的语法。有时在进行编写程序,写到查询语句时,往往我会使用kibana进行书写,然后再粘贴到程序中。(不容易出错)

4.1.1.下载

ElasticSearch官网:https://www.elastic.co/cn/

4.1.2.安装

在window中安装Kibana很方便,解压即安装

4.1.3.修改配置

修改config/kibana.yml配置:

server.port: 5601
server.host: "0.0.0.0" #允许来自远程用户的连接
elasticsearch.url: http://192.168.204.132:9200 #Elasticsearch实例的URL 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dQEeRsKC-1663912098165)(F:\桌面\kibana配置.png)]

4.1.4.启动

./bin/kibana

4.1.5.测试

在这里插入图片描述

4.2.安装head
4.2.1.什么是head

head插件是ES的一个可视化管理插件,用来监视ES的状态,并通过head客户端和ES服务进行交互,比如创建映射、创建索引等。从ES6.0开始,head插件支持使得node.js运行。

4.2.2.安装

1、下载head

​ 下载地址:https://github.com/mobz/elasticsearch-head

2、运行

npm run start
4.2.3.测试

浏览器访问:http://127.0.0.1:9100/

在这里插入图片描述

5.ES快速入门

​ ES作为一个索引及搜索服务,对外提供丰富的REST接口,快速入门部分的实例使用kibana来测试,目的是对ES的使用方法及流程有个初步的认识。

5.1.index管理

此图为下面提到的部分操作

在这里插入图片描述

5.1.1.创建index

索引库。包含若干相似结构的 Document 数据,相当于数据库的database。

语法:PUT /index_name

如:

PUT /java2203
{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1
  }
}

number_of_shards - 表示一个索引库将拆分成多片分别存储不同的结点,提高了ES的处理能力

number_of_replicas - 是为每个 primary shard分配的replica shard数,提高了ES的可用性,如果只有一台机器,设置为0

效果:

在这里插入图片描述

5.1.2.修改index

注意:索引一旦创建,primary shard 数量不可变化,可以改变replica shard 数量。

语法:PUT /index_name/_settings

如:

PUT /java2203/_settings
{
  "number_of_replicas" : 1
}

ES 中对 shard 的分布是有要求的,有其内置的特殊算法:

​ Replica shard 会保证不和他的那个 primary shard 分配在同一个节点上;如过只有一个节点,则此案例执行后索引的状态一定是yellow。

5.1.3.删除index
DELETE /java2203
5.2.mapping管理

映射,创建映射就是向索引库中创建field(类型、是否索引、是否存储等特性)的过程,下边是document和field与关系数据库的概念的类比:

elasticsearch关系数据库
index(索引库)database(数据库)
type(类型)table(表)
document(文档)row(记录)
field(域)column(字段)

注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,ES6.x 版本之后,type概念被弱化ES官方将在ES7.0版本中彻底删除type。

5.2.1 创建mapping

语法:POST /index_name/type_name/_mapping

如:

POST /java06/course/_mapping
{
  "properties": {
     "name": {
        "type": "text"
     },
     "description": {
        "type": "text"
     },
     "studymodel": {
        "type": "keyword"
     }
  }
}
5.2.2.查询mapping

查询所有索引的映射:

GET /java06/course/_mapping
5.2.3.更新mapping

映射创建成功可以添加新字段,已有字段不允许更新。

5.2.4.删除mapping

通过删除索引来删除映射。

5.3.document管理
5.3.1.创建document

ES中的文档相当于MySQL数据库表中的记录。

5.3.1.1.POST语法

此操作为 ES 自动生成 id 的新增 Document 方式。

语法:POST /index_name/type_name/id

如:

POST /java06/course/1
{
  "name":"python从入门到放弃",
  "description":"人生苦短,我用Python",
  "studymodel":"201002"
}

POST /java06/course
{
  "name":".net从入门到放弃",
  "description":".net程序员谁都不服",
  "studymodel":"201003"
}
5.3.1.2.PUT语法

此操作为手工指定 id 的 Document 新增方式。

语法:PUT/index_name/type_name/id{field_name:field_value}

如:

PUT /java06/course/2
{
  "name":"php从入门到放弃",
  "description":"php是世界上最好的语言",
  "studymodel":"201001"
}

结果:

{
  "_index": "test_index", 新增的 document 在什么 index 中,
  "_type": "my_type", 新增的 document 在 index 中的哪一个 type 中。
  "_id": "1", 指定的 id 是多少
  "_version": 1, document 的版本是多少,版本从 1 开始递增,每次写操作都会+1
  "result": "created", 本次操作的结果,created 创建,updated 修改,deleted 删除
  "_shards": { 分片信息
      "total": 2, 分片数量只提示 primary shard
      "successful": 1, 数据 document 一定只存放在 index 中的某一个 primary shard 中
      "failed": 0
  },
  "_seq_no": 0, 
  "_primary_term": 1
}

通过head查询数据:

在这里插入图片描述

5.3.2.查询document

语法:

GET /index_name/type_name/id

GET /index_name/type_name/_search?q=field_name:field_value

如:根据课程id查询文档

GET /java2203/course/1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S5oeXIMQ-1663912098174)(C:\Users\lyf\AppData\Roaming\Typora\typora-user-images\1663905234330.png)]

如:查询所有记录

GET /java06/course/_search

在这里插入图片描述

5.3.3.删除Document

​ ES 中执行删除操作时,ES先标记Document为deleted状态,而不是直接物理删除。当ES 存储空间不足或工作空闲时,才会执行物理删除操作,标记为deleted状态的数据不会被查询搜索到(ES 中删除 index ,也是标记。后续才会执行物理删除。所有的标记动作都是为了NRT(近实时)实现)

语法:DELETE /index_name/type_name/id

如:

DELETE /java2203/course/3

结果:

{
  "_index": "java2203",
  "_type": "course",
  "_id": "2",
  "_version": 2,
  "result": "deleted",
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 3,
  "_primary_term": 1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值