Elasticsearch的Restful风格API
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
1、Restful及JSON格式
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用 XML 格式定义或 JSON 格式定义。REST(英文:Representational State Tranfer,简称REST)描述了一个架构样式的网络系统,比如web应用程序
JSON格式:
数据类型 | 描述 | 举例 |
---|---|---|
字符串 | 要求使用双引号("")引起来的数据 | "elasticsearch" |
数字 | 通常指的是0-9的所有数字 | 100 |
布尔值 | 只有true和false两个值 | true |
空值 | 只有null一个值 | null |
数组 | 使用一对中括号("[]")放入不同的元素(支持高级数据和基础数据类型) | ["linux","docker"] |
对象 | 使用一对大括号("{}")括起来,里面的数据使用KEY-VALUE键值对即可 | {"class":"linux","age":25} |
2、Elasticsearch的相关术语
- Document:文档,是用户存储在ES的一些数据,它是ES中最小的存储单元
- field:相当于数据库表的字段,对文档数据根据不同属性进行分类标示
- index:索引;一个索引就是一个拥有相似特征文档的集合
- shard:分片;真正存储数据的地方,每个分片底层对应的是一个Lucene库。一个索引至少有1个或多个分片
- replica:副本;对数据的备份,一个分片可以有0个或多个副本。一旦副本数量不为0,就会引入主分片(primary shard)和副本分片(replica shard)的概念
-
主分片(primary shard):可以实现对数据的读写操作
-
副本分片(replica shard):可以实现数据读操作,与此同时,需要去主分片同步数据,当主分片挂掉,副本分片会变为主分片
-
- Allocation:分配;将分片(shard)分配给某个节点的过程,包括主分片与副本分片;如果是副本分片,它还包含主分片复制数据的过程,这个分配过程由master节点调度完成
- Type:在es 5.x即更早的版本,在一个索引中,我们可以定义一种或多种数据类型。但在es7仅支持"_doc"类型。
3、管理索引的API
3.1、查看索引信息
GET http://192.168.1.10:9200/_cat/indices # 查看全部的索引信息
GET http://192.168.1.10:9200/_cat/indices?v # 查看表头信息
GET http://192.168.1.10:9200/_cat/indices/.kibana_7.17.3_001?v # 查看单个索引
GET http://192.168.1.10:9200/.kibana_7.17.3_001 # 查看单个索引的详细信息
3.2、创建索引
# 创建索引并指定分片和副本
PUT http://192.168.1.10:9200/cluster-linux2
{
"settings":{
"index":{
"number_of_shards": "3",
"number_of_replicas": 0
}
}
}
# 参数说明
"number_of_shards": 指定分片数量
"number_of_replicas": 指定副本数量
3.3、修改索引
PUT http://192.168.1.10:9200/cluster-linux/_settings
{
"number_of_replicas": 0
}
# 注意:分片数量无法修改,副本数量是可以修改的
3.4、删除索引
DELETE http://192.168.1.10:9200/cluster-linux
# 删除索引,服务器的数据也会随之删除
3.5、索引别名
POST http://192.168.1.10:9200/_aliases # 添加索引别名
{
"actions": [
{
"add": {
"index": "cluster-linux",
"alias": "2024"
}
},
{
"add": {
"index": "cluster-linux1",
"alias": "23世纪"
}
}
]
}
GET http://192.168.1.10:9200/_aliases # 查看所有索引的别名
POST http://192.168.1.10:9200/_aliases # 删除索引
{
"actions": [
{
"remove": {
"index": "cluster-linux",
"alias": "2024"
}
}
]
}
POST http://192.168.1.10:9200/_aliases # 修改索引别名
{
"actions": [
{
"remove": {
"index": "cluster-linux",
"alias": "2024"
}
},
{
"add": {
"index": "cluster-linux",
"alias": "23世纪"
}
}
]
}
3.6、索引关闭
索引关闭意味着无法进行任何的读写操作,但数据并不会被删除;
POST http://192.168.1.10:9200/cluster-linux/_close # 关闭索引
POST http://192.168.1.10:9200/cluster-*/_close # 基于通配符关闭索引
3.7、索引打开
POST http://192.168.1.10:9200/cluster-linux/_open # 打开索引
POST http://192.168.1.10:9200/cluster-*/_open # 基于通配符打开索引
4、管理文档的API
4.1、文档的创建
# 创建文档
POST http://192.168.1.10:9200/teacher/_doc
{
"name":"cluster",
"hobby":[
"Linux",
"Docker"
]
}
# 创建文档并指定id
http://192.168.1.10:9200/teacher/_doc/1001
# 文档类型
http://192.168.1.10:9200/student/linux/1001
http://192.168.1.10:9200/student/_doc/1002
4.2、文档的查看
源数据:指的是用户写入的数据
元数据:描述数据的数据,由ES内部维护
GET http://192.168.1.10:9200/teacher/_search #查看所有文档
GET http://192.168.1.10:9200/teacher/_doc/LQSMhJEBbNOjcNtbiy97 # 查看某一个文档
HEAD http://192.168.1.10:9200/teacher/_doc/LQSMhJEBbNOjcNtbiy97 # 判断一个文档是否存在,返回200、404
4.3、文档的修改
# 全局更新,会覆盖原有的文档数据内容
POST http://192.168.1.10:9200/teacher/_doc/LQSMhJEBbNOjcNtbiy97
{
"name":"cluster",
"hobby":[
"Linux",
"Docker",
"Java"
]
}
# 局部更新,并不会覆盖原有的文档数据内容
POST http://192.168.1.10:9200/teacher/_doc/LQSMhJEBbNOjcNtbiy97/_update
{
"doc": {
"name": "小李"
"age": 22
}
}
4.4、文档的删除
DELETE http://192.168.1.10:9200/teacher/_doc/1001
4.5、文档的批量操作
# 批量创建
POST http://192.168.1.10:9200/_bulk
{"create":{"_index":"cluster-linux-elk"}}
{"name":"user1","hobby":["u1xx1","u1xx2"]}
{"create":{"_index":"cluster-linux-elk","_id": 1002}}
{"name":"user2","hobby":["u2xx1","u2xx2"]}
{"create":{"_index":"cluster-linux-elk","_id": 1001}}}
{"name":"user3","hobby":["u3xx1","u3xx2"]}
# 批量删除
POST http://192.168.1.10:9200/_bulk
{"delete":{"_index":"cluster-linux-elk","_id": "1001" }}
{"delete":{"_index":"cluster-linux-elk","_id": "1002" }}
# 批量修改
POST http://192.168.1.10:9200/_bulk
{"update":{"_id":"1001","_index": "cluster-linux-elk" }}
{"doc":{"name":"更改1"}}
{"update":{"_id":"1002","_index": "cluster-linux-elk" }}
{"doc":{"name":"更改2"}}
# 批量查看
POST http://192.168.1.10:9200/_mget
{
"docs": [
{
"_index": "cluster-linux-elk",
"_id": "1001"
},
{
"_index": "cluster-linux-elk",
"_id": "1002"
}
]
}
5、使用映射(mapping)自定义数据类型
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/mapping.html
映射是定义文档及其包含的字段如何存储和索引的过程
每个文档都是字段的集合,每个字段都有自己的数据类型。映射数据时,我们创建一个映射定义,其中包含与文档相关的字段列表。映射定义还包括元数据字段,例如_source自定义 如何处理文档的关联元数据的字段。
使用动态映射和显式映射来定义数据。每种方法 根据您在数据旅程中所处的位置提供不同的优势。为 例如,显式映射您不想使用默认值的字段,或者将字段映射到 更好地控制创建的字段。然后,您可以允许 Elasticsearch 动态添加其他字段。
5.1、IP案例
# 创建索引时指定映射关系
PUT http://192.168.1.10:9200/cluster-linux-elk
{
"mappings":{
"properties":{
"ip_addr":{
"type":"ip"
}
}
}
}
#查看索引时指定映射关系
GET http://192.168.1.10:9200/cluster-linux-elk
# 查看IP的网段
GET http://192.168.1.10:9200/cluster-linux-elk/_search
{
"query":{
"match":{
"ip_addr":"192.168.0.0/16"
}
}
}
5.2、其他数据案例
# 创建索引
PUT http://192.168.1.10:9200/cluster-linux-elk-2024
# 修改索引的数据类型
PUT http://192.168.1.10:9200/cluster-linux-elk-2024/_mapping
{
"properties": {
"name": {
"type": "text",
"index": true
},
"gender": {
"type": "keyword",
"index": true
},
"telephone": {
"type": "text",
"index": false
},
"address": {
"type": "keyword",
"index": false
},
"email": {
"type": "keyword"
},
"ip_addr": {
"type": "ip"
}
}
}
# 添加测试数据
{"create":{"_index":"cluster-linux-elk-2024"}}
{"ip_addr":"192.168.10.10","name":"zhangsan","gender":"male","telephone":"123456","address":"xxx","email":"zhangsan@qq.com"}
{"create":{"_index":"cluster-linux-elk-2024"}}
{"ip_addr":"192.168.20.20","name":"lisi","gender":"male","telephone":"333333","address":"yyy","email":"lisi@qq.com"}
{"create":{"_index":"cluster-linux-elk-2024"}}
{"ip_addr":"172.28.30.101","name":"wangwu","gender":"female","telephone":"44444","address":"zzz","email":"wangwu@qq.com"}
{"create":{"_index":"cluster-linux-elk-2024"}}
{"ip_addr":"172.28.50.15","name":"zhaoliu","gender":"female","telephone":"55555","address":"ddd","email":"zhaoliu@qq.com"}
{"create":{"_index":"cluster-linux-elk-2024"}}
{"ip_addr":"10.0.0.67","name":"xiaoli","gender":"male","telephone":"66666","address":"aaa","email":"xiaoli@qq.com"}
# 基于genders搜索
FET http://192.168.1.10:9200/cluster-linux-elk-2024/_search
{
"query":{
"match":{
"gender":"female"
}
}
}
# 注意:type类型为keyword的查询时得一致,反之;index默认为true,代表可以查询,反之
6、中文分词器官
6.1、内置的标准分词器-分析英文
# 标准分词器模式使用空格和符号进行切割分词的;
GET http://192.168.1.10:9200/_analyze
{
"analyzer":"standard",
"text":"My name is Zhangsan and I'm 18 years old !"
}
6.2、内置的标准分词器-分析中文并不友好
# 标准分词器模式使用单个汉字进行分隔;
GET http://192.168.1.10:9200/_analyze
{
"analyzer":"standard",
"text":"我爱北京天安门!"
}
6.3、下载中文分词器
https://github.com/medcl/elasticsearch-analysis-ik
安装IK分词器
install -d /cluster/softwares/es/plugins/ik -o elsearch -g elsearch
cd /cluster/softwares/es/plugins/ik
unzip elasticsearch-analysis-ik-7.17.3.zip
rm -f elasticsearch-analysis-ik-7.17.3.zip
chown -R elsearch:elsearch *
重启ES节点,使其加载插件;
systemctl restart es
测试IK分词器
# 细粒度拆分
GET http://192.168.1.10:9200/_analyze
{
"analyzer":"ik_max_word",
"text":"我爱北京天安门"
}
# 粗粒度拆分
GET http://192.168.1.10:9200/_analyze
{
"analyzer":"ik_smart",
"text":"我爱北京天安门"
}
6.7、自定义字典
# 进入到IK分词器的插件安装目录
cd /cluster/softwares/es/plugins/ik/config
# 自定义字典
cat > cluster-linux.dic << 'EOF'
上号
EOF
chown elsearch:elsearch cluster-linux.dic
# 加载自定义字典
vim IKAnalyzer.cfg.xml
..
<entry key="ext_dict">cluster-linux.dic</entry>
# 重启ES集群
systemctl restart es
# 测试分词器
GET http://192.168.1.10:9200/_analyze
{
"analyzer":"ik_smart",
"text":"嗨,哥们,上号!"
}
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!