IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> ElasticSearch学习 -> 正文阅读

[大数据]ElasticSearch学习


官方文档
中文文档

基本概念

文章

上面这篇文章可以对其有个很好的理解

1、Index

索引这个词在 ElasticSearch 会有三种意思:

1)、索引(名词)

类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库(Database)。索引由其名称(必须为全小写字符)进行标识。(现在看来更相当于数据库的Table)

2)、索引(动词)

保存一个文档到索引(名词)的过程。这非常类似于SQL语句中的 INSERT关键词。如果该文档已存在时那就相当于数据库的UPDATE。

3)、倒排索引

关系型数据库通过增加一个B+树索引到指定的列上,以便提升数据检索速度。索引ElasticSearch 使用了一个叫做 倒排索引 的结构来达到相同的目的。

2、Type

一个Index下支持多个Type–有点类似于消息队列一个topic下多个group的概念

Type 可以理解成关系数据库中Table。

之前的版本中,索引和文档中间还有个类型的概念,每个索引下可以建立多个类型,文档存储时需要指定index和type。

从6.0.0开始单个索引中只能有一个类型,7.0.0以后将将不建议使用,8.0.0 以后完全不支持。

弃用该概念的原因:

我们虽然可以通俗的去理解Index比作 SQL 的 Database,Type比作SQL的Table。但这并不准确,因为如果在SQL中,Table 之前相互独立,同名的字段在两个表中毫无关系。但是在ES中,同一个Index 下不同的 Type 如果有同名的字段,他们会被 Luecence当作同一个字段,并且他们的定义必须相同。

而Type字段并没有多少意义。目前Type已经被Deprecated,在7.0开始,一个索引只能建一个Type为_doc

3、Document

Document 等同于关系型数据库表中的行。(Document相当于数据库的一行记录)

_index 文档所属索引名称。

_type 文档所属类型名。

_id Doc的主键。在写入的时候,可以指定该Doc的ID值,如果不指定,则系统自动生成一个唯一的UUID值。

_version 文档的版本信息。Elasticsearch通过使用version来保证对文档的变更能以正确的顺序执行,避免乱序造成的数据丢失。

_seq_no 严格递增的顺序号,每个文档一个,Shard级别严格递增,保证后写入的Doc的_seq_no大于先写入的Doc的_seq_no。

primary_term primary_term也和_seq_no一样是一个整数,每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1

found 查询的ID正确那么ture, 如果 Id 不正确,就查不到数据,found字段就是false。

_source 文档的原始JSON数据。

4、其他

  • Field:相当于数据库的Column (属性就是列名)
  • Mapping:相当于数据库的Schema( schema是元数据的一个抽象集合,包含一套schema component: 主要是元素与属性的声明、复杂与简单数据类型的定义 )
  • DSL:相当于数据库的SQL(给我们读取Elasticsearch数据的API)

Docker中安装

下载(全部)

docker pull elasticsearch:[版本] 存储和检索数据
docker pull kibana:[版本] 可视化检索数据
# 版本要一致

配置(elasticsearch)

# 将docker里的目录挂载到linux的/mydata目录中
# 修改/mydata就可以改掉docker里的
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data

# es可以被远程任何机器访问
echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml

# 递归更改权限,es需要访问(不建议)
chmod -R 777 /mydata/elasticsearch/

启动(elasticsearch)

# 9200是用户交互端口 9300是集群心跳端口
# -e指定是单阶段运行
# -e指定占用的内存大小,生产时可以设置32G
# -v来挂载,修改前者就是修改后者,装插件不用进容器内部了
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e  "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v  /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2 


# 设置开机启动elasticsearch
docker update elasticsearch --restart=always

权限

如何想要修改文件,结果没有权限;怎么办呢?

# r (读) = 4
# w (写) = 2
# x (可执行) = 1
# 无权限 = 0 特定用户类的权限数字是该类的权限值之和。

# setuid = 4
# setgid = 2
# sticky = 1
# no changes = 0 接下来的三位数的含义与使用三位数时相同。
chmod -R 777 #使用这个可以让你拥有所有全县(4+2+1 = 7)(但是并不建议使用该命令)

文件或目录设置777权限意味着它将对所有用户都是可读、可写和可执行的,并且可能会带来巨大的安全风险。

例如,如果你以递归方式将 /var/www 目录下所有文件和子目录的权限更改为777,则系统上的任何用户都可以创建、删除或修改该目录中的文件。

如果你的Web服务器遇到权限问题,请将文件的所有权更改为运行应用程序的用户,并将文件的权限设置为644,将目录的权限设置为755,而不是递归地将权限设置为777。

可以使用chown命令更改文件所有权,使用chmod命令更改权限。

假设您的服务器上有一个应用程序以用户“www”身份运行。

要设置要运行的正确权限,请执行以下操作:

chown -R www: /var/www
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;

只有root用户、文件所有者或具有sudo权限的用户才能更改文件的权限。

使用chmod时要格外小心,特别是在递归更改权限的时候。

启动(kibana)

# kibana指定了了ES交互端口9200  # 5600位kibana主页端口
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 -d kibana:7.4.2


# 设置开机启动kibana
docker update kibana  --restart=always

测试

http://192.168.56.10:9200 #浏览器或者请求连接的工具打开,查看版本信息

初步使用

ES里面存的都是json文档

1、基本信息查看

都是主机地址加/_cat……

  1. GET /_cat/nodes:查看所有节点 (*代表主节点)
  2. GET /_cat/health:查看es健康状况
  3. GET /_cat/master:查看主节点
  4. GET/_cat/indicies:查看所有索引 ,等价于mysql数据库的show databases;

2、新增

# PUT新增
# # 在customer索引下的external类型下保存1号数据
PUT customer/external/1

# POSTMAN输入
http://192.168.56.10:9200/customer/external/1

# 同时在请求体中加入json数据就行了

PUT和POST区别

  1. POST不指定id,一直发送请求,会一直(指定不存在的id)新增(自动生成唯一标识id)。指定id后,继续以这个id发送请求,就是(指定存在的id)更新操作了,会迭代(根据内容变化)版本号
  2. PUT可以新增也可以修改,但是必须指定id,版本号也会一直迭代

所有的请求成功后,会返回

返回数据:
带有下划线开头的,称为元数据,反映了当前的基本信息。  
{
    "_index": "customer", 表明该数据在哪个数据库下;
    "_type": "external", 表明该数据在哪个类型下;
    "_id": "1",  表明被保存数据的id;
    "_version": 1,  被保存数据的版本
    "result": "created", 这里是创建了一条数据,如果重新put一条数据,则该状态会变为updated,并且版本号也会发生变化。
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

3、查询

使用GET /customer/external/1或者http://192.168.56.10:9200/customer/external/1发送请求,然后返回:

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 1,
    "_seq_no": 1,//并发控制字段,每次更新都会+1,用来做乐观锁
    "_primary_term": 1,//同上,主分片重新分配,如重启,就会变化
    "found": true,
    "_source": {
        "name": "John Doe"
    }
}

更新

就是当两个人并发操作这一个name(_source中的)时,前一个人操作后(请求链接后加if_seq_no=1&if_primary_term=1),这个_seq_no每次更新操作后都会改变,后一个人再按原来的操作(需要最新的这个值)就会报错error(类似乐观锁,需要有if_seq_no=1&if_primary_term=1才会出现这种情况)

4、更新

# 使用_update,需要用"doc";不然会出现解析异常
POST customer/externel/1/_update
{
    "doc":{
        "name":"111"
    }
}
或者
POST customer/externel/1
{
        "name":"222"
}
或者
PUT customer/externel/1
{
        "name":"222"
}
  1. POST带_update,更新的时候会对比数据是否改变,没有变化则不会改变版本号等
  2. POST不带_update以及PUT操作每次更新都会改变版本号

对于大并发更新,不带update

对于大并发查询偶尔更新,带update;对比更新,重新计算分配规则

5、删除

DELETE customer/external/1
DELETE customer
  • elasticsearch并没有提供删除类型的操作,只提供了删除索引和文档的操作 (type现在弃用了)

  • 重复删除会找不到,删除后也查询不到

  • 删除索引后,查询所有索引就查不到了

6、bulk批量API

POST 主机地址//customer/external/_bulk

#两行为一个整体
{"index":{"_id":"1"}}
{"name":"a"}
{"index":{"_id":"2"}}
{"name":"b"}
#注意格式json和text均不可,要去kibana里Dev Tools

#格式
{action:{metadata}}\n
{request body  }\n

{action:{metadata}}\n
{request body  }\n
  • 某一条执行发生失败时,其他的数据仍然能够接着执行,也就是说彼此之间是独立的
  • 当bulk api返回时,它将提供每个动作的状态(与发送的顺序相同),所以您可以检查是否一个指定的动作是否失败了

在kibana里Dev Tools的例子

POST /customer/external/_bulk
{"index":{"_id":"1"}}
{"name":"John Doe"}
{"index":{"_id":"2"}}
{"name":"John Doe"}

整个ES执行批量操作

POST /_bulk
{"delete":{"_index":"website","_type":"blog","_id":"123"}}
{"create":{"_index":"website","_type":"blog","_id":"123"}}
{"title":"my first blog post"}
{"index":{"_index":"website","_type":"blog"}}
{"title":"my second blog post"}
{"update":{"_index":"website","_type":"blog","_id":"123"}}
{"doc":{"title":"my updated blog post"}}

7、批量导入数据

准备一份文档样本,每一个都有下列的schema(模式)。可以理解为一种规范。

{
	"account_number": 1,
	"balance": 39225,
	"firstname": "Amber",
	"lastname": "Duke",
	"age": 32,
	"gender": "M",
	"address": "880 Holmes Lane",
	"employer": "Pyrami",
	"email": "amberduke@pyrami.com",
	"city": "Brogan",
	"state": "IL"
}

导入测试数据 (也可以在其他地方找到测试数据)

最后执行:

POST bank/account/_bulk # 必须指定索引 (就是数据库==类比)
上面的数据
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:23:07  更:2022-04-27 11:26:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:53:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码