ES
1. ES的原理和基本概念
ES一般使用保存日志数据,对数据做日志做一些管理,ElasticSearch(resful风格)数据只有json类型的,
ElastricSearch和Solr都是基于Lucene的全文搜索引擎服务器
Lucene:
apache的子项目开源的全文搜索引擎工具包
倒排索引:
通过term或者说某个词记录其所在的文档的地址,来查找文档中的内容
Lucence的内部结构
索引:一个索引对应一个文件夹,文件夹里的分件构成一个Luence索引
段:一个索引可以包含多个段 段相互独立也可以合并,添加文档(doc)也会添加段
文档:文档是Lucence最小的单位,不同的文档存在不同的段中,每个段可以存多个文档
域(字段):一篇文档中有多个字段,可以存在不同的域中
词:是索引最小的单位,经过词法分析或者语言处理后的字符串 索引(index) -----> 数据库
类型(type)-----> 表
文档(doc)-----> 行
字段(fields)-----> 列
term (项) -----> 里面的某个字符分词:ik分词器
对于一些没有意义的词不建立索引,不使用,不与doc文档地址链接
keyword 不进行分词不做拆分,直接根据字符串的内容建立反向索引
text 进行分词 根据分词建立反向索引
Elasticsearch分布式
分布式节点是对等,选出一个Master然后Master负责进行写入和更新操作,而且Elasticsearch会对数据进行切分,同每个分片也会保存多个副本保证高可可用
只有建立索引和类型需要经过master
数据的写入有一简单的路由规则,可以route到集群的任意节点,所以数据写入压力是分散在整个集群中的
可以做搜索和日志分析加上kibana
2. ES和Kibana的下载与安装
-
ES下载地址
-
Kibana下载地址
-
ES和Kibanna的对照表
-
es安装步骤 (es安装真的坑)
# 1. 修改es 内存配置,不然启动不起来 vim /nikaboy/elasticsearch-8.2.2/config/jvm.options -Xms512m -Xmx512m # 2. 创建一个普通用户,es无法在root用户进行操作 useradd es passwd es chown -R es /nikaboy/elasticsearch-8.2.2 # 配置es用户对文件目录的权限 # 3. 编辑 /etc/security/limits.conf es soft nofile 65536 es hard nofile 65536 es soft nproc 4096 es hard nproc 4096 # 4. 编辑 /etc/security/limits.d/20-nproc.conf,将* 改为用户名(es) es soft nproc 4096 root soft nproc unlimited # 5. vi 编辑 /etc/sysctl.conf vm.max_map_count = 655360 # 6.配置application.yml # 7. su es 切换到es用户 nohup ./bin/elasticsearch > msg.log 2>&1 & # 后台启动es # 8. 访问 http://192.168.10.10:9200/
es的application.yml文件
cluster.name: my-application #集群名称 node.name: node-1 #节点名称 #数据和日志的存储目录 path.data: /nikaboy/elasticsearch-8.2.2/db/data path.logs: /nikaboy/elasticsearch-8.2.2/db/logs #设置绑定的ip,设置为0.0.0.0以后就可以让任何计算机节点访问到了 network.host: 0.0.0.0 http.port: 9200 #端口 #设置在集群中的所有节点名称,这个节点名称就是之前所修改的,当然你也可以采用默认的也行,目前是单机,放入一个节点即可 cluster.initial_master_nodes: ["node-1"] #----------------------- BEGIN SECURITY AUTO CONFIGURATION ----------------------- # # The following settings, TLS certificates, and keys have been automatically # generated to configure Elasticsearch security features on 08-11-2022 13:02:52 # # -------------------------------------------------------------------------------- # Enable security features xpack.security.enabled: false # 关闭ssl认证 xpack.security.enrollment.enabled: true # Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents xpack.security.http.ssl: enabled: false # 关闭ssl认证 keystore.path: certs/http.p12 # Enable encryption and mutual authentication between cluster nodes xpack.security.transport.ssl: enabled: true verification_mode: certificate keystore.path: certs/transport.p12 truststore.path: certs/transport.p12 #----------------------- END SECURITY AUTO CONFIGURATION -------------------------
-
安装Kibanna(可视化监控es)
-
配置kibanna的yml文件 (cd /nikaboy/kibana-8.2.2/config)
server.port: 5601 server.host: "0.0.0.0" server.name: "kibana" elasticsearch.hosts: ["http://127.0.0.1:9200/"] i18n.locale: "zh-CN"
-
切换普通用户启动 访问
nohup ./bin/kibana >msg.log 2>&1 & #访问地址 http://192.168.10.10:5601/
-
-
3.ES使用
- kibaba的使用
-
索引增删改查
# 创建一个索引 PUT /nikaboy { "settings": { "number_of_shards": 5, ## 分片数量 默认为1 "number_of_replicas": 1 ## 备份数量 默认为1 } } # 查看索引 GET /nikaboy # 删除索引 DELETE /nikaboy
-
ES中Field可以指定的类型
字符串String:
text:一般用于全文检索。将当前的field进行分词
keyword: 当前的Field不可被分词
数值类型Numeric:
long,
integer,
short,
byte,
double,
float,
half_float,
scaled_float
时间类型Data:
date,可以指定具体的格式
布尔类型Boolean:
boolean
二进制类型Binary:
binary
范围类型Range:
integer_range, float_range, long_range, double_range, date_range
经纬度类型:
geo_point:用来存储经纬度
ip类型:
ip:可以存储ipv4或者ipv6
-
增删改数据
-
创建包含数据结构的索引
PUT /student { "settings": { "number_of_shards": 5, "number_of_replicas": 1 }, "mappings": { "properties":{ "name":{ "type":"text" }, "age":{ "type":"integer" }, "sex":{ "type":"byte" }, "native":{ "type":"keyword" }, "birthDate":{ "type":"date" }, "sno":{ "type":"keyword" } } } }
-
可能会遇到问题:Failed to parse mapping: Root mapping definition has unsupported parameters…在7.+版本,已经不支持索引创建type,默认类型是_doc
-
给类型字段增删改
## 给student 增加 class_name 字段 PUT /student/_mapping { "properties":{ "class_name":{ "type":"text" } } } ## 增加某个学生的某个字段 POST /student/_update/12345678 { "script": { "source": "ctx._source.price=34" } } ## 删除某个学生的某个字段 POST /student/_update/12345678 { "script": { "source":"ctx._source.remove(\"price\")" } }
-
增加数据
## 增加数据 POST /student/_doc { "name": "小王", "sex": 1, "birthDate" : "2020-11-11", "class_name" : "计算机科学一班", "native": "广州天河区", "sno": "12345678", "age": "2" } ## 查看数据 POST /student/_search { "query": { "match_all": { } } } ## 根据id删除某条数据 DELETE /student/_doc/cW-LZ4QBLCdlaqLEGlVK ## 根据id修改某个字段的数据 POST /student/_update/cG-KZ4QBLCdlaqLE6lUF { "doc": { "name":"小雅" } } ## script 脚本方式 更新数据 将id为12345678的学生班级名修改为二班 POST /student/_update/12345678 { "script":{ "source": "ctx._source.class_name = params.class_name", "params": { "class_name":"计算机科学二班" } } } ## ## 创建一个 script 脚本 POST _scripts/my_scripts_01 { "script":{ "source": "ctx._source.class_name = params.class_name", "lang": "painless" } } ## 查看script脚本 GET _scripts/my_scripts_01 ## 删除script脚本 DELETE _scripts/my_scripts_01 ##使用脚本 POST /student/_update/12345678 { "script":{ "id":"my_scripts_01", "params": { "class_name":"计算机科学三班" } } } ## 找到出name为小雅学生 修改为 小爱 POST /student/_update_by_query { "query": { "match_phrase": { "name":"小雅" } }, "script": { "source": "ctx._source.name=params.name;ctx._source.class_name=params.class_name", "lang": "painless", "params": { "name":"小爱", "class_name":"二班" } } }
ES内部对partial update的实际执行,跟传统的全量替换方式,是几乎一样的
1.内部先获取document
2.将传过来的field更新到document的json中
3.将老的document标记为deleted
4.将修改后的新的document创建出来
-
查询数据
-
查看筛选字段
POST /student/_search { "query": { "match_all": { } }, "_source": ["age","name","sno"] # 只显示_doc的这三个字段 ,类似 mysql的 Select age,name,sno from student }
-
分页类似mysql的 limit 和 排序 order by
## 分页 0 - 3 POST /student/_search { "query": { "match_all": { } }, "from": 0, "size": 3 } ## 根据 age 去排序 POST /student/_search { "query": { "match_all": { } }, "sort": [ { "age": { "order": "desc" } } ], "from": 0, "size": 3 }
-
terms 和term的使用,根据term 找到整个文档,如果字段可以分词,则模糊查出数据,如果不能能分词则需要数据字段中所有的数据文章来源:https://www.toymoban.com/news/detail-660363.html
{ "query": { "terms": { "name": [ "小", "雅" ] } }, "from": 0, "size": 3 } ## native 数据类型为keyword 无法分词,不是模糊查询 POST /student/_search { "query": { "terms": { "native": [ "广州" ] } }, "from": 0, "size": 3 } POST /student/_search { "query": { "term": { "name":"王" } }, "from": 0, "size": 3 }
-
match的使用,是对term的封装,如果可以分词则把数据切割成多个term查询,返回结果集文章来源地址https://www.toymoban.com/news/detail-660363.html
POST /student/_search { "query": { "match": { "native":"广州天河区" } }, "from": 0, "size": 3 } POST /student/_search { "query": { "match": { "native":"广州" } }, "from": 0, "size": 3 } POST /student/_search { "query": { "match": { "name":"小王" } }, "from": 0, "size": 3 } ## 基于一个Filed匹配的内容,采用and或者or的方式进行连接 POST /student/_search { "query": { "match": { "class_name":{ "query": "一班 计算机", "operator": "and" } } }, "from": 0, "size": 3 }
- multi_match的使用,一个text数据应用在多字段上查询的结果集合
//相当于mysql (class_name like '%计算机%' ) or (name like '%计算机%') POST /student/_search { "query": { "multi_match": { "query": "计算机", "fields": ["class_name"
-
到了这里,关于ES完整使用从安装到springboot项目操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!