官方文档
中文文档
基本概念
文章
上面这篇文章可以对其有个很好的理解
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)
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml
chmod -R 777 /mydata/elasticsearch/
启动(elasticsearch)
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
docker update elasticsearch --restart=always
权限
如何想要修改文件,结果没有权限;怎么办呢?
chmod -R 777
对文件或目录 设置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)
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 -d kibana:7.4.2
docker update kibana --restart=always
测试
http://192.168.56.10:9200
初步使用
ES里面存的都是json文档
1、基本信息查看
都是主机地址加/_cat……
GET /_cat/nodes :查看所有节点 (*代表主节点)GET /_cat/health :查看es健康状况GET /_cat/master :查看主节点GET/_cat/indicies :查看所有索引 ,等价于mysql数据库的show databases;
2、新增
PUT customer/external/1
http://192.168.56.10:9200/customer/external/1
PUT和POST区别
- POST不指定id,一直发送请求,会一直(指定不存在的id)新增(自动生成唯一标识id)。指定id后,继续以这个id发送请求,就是(指定存在的id)更新操作了,会迭代(根据内容变化)版本号
- 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,
"_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"
}
- POST带_update,更新的时候会对比数据是否改变,没有变化则不会改变版本号等
- POST不带_update以及PUT操作每次更新都会改变版本号
对于大并发更新,不带update
对于大并发查询偶尔更新,带update;对比更新,重新计算分配规则
5、删除
DELETE customer/external/1
DELETE customer
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
上面的数据
|