ES(分布式、开源、查询)
传统数据一般会分三个方向:结构化数据、非结构化数据、半结构化数据
结构化数据:一般每个字段之间都是有关系的,例如mysql的主键唯一id代表了该条数据的唯一定位(mysql、mongodb)
非结构化数据:无法用二维表结构来设计,文章、日志、视频、图片等等(mongodb、redis)
半结构化数据:html等等
es特点
1、使用倒排索引,检索快,且检索效果好
2、可扩展性(高可用)
3、插件机制(ik「分词器」、pinyin「拼音转换分词器」、简繁转换等等。。)
4、相关度
5、弹性,跨集群,热备份(7.x)
6、包含行(结构化数据、非结构化数据)
组成部分:
集群->节点->索引->分片和副本->decument-term/token
es请求与返回
使用json字符串形式
javascript object notation
正排&倒排
正排索引:
以文档的ID为关键字,记录文档中每个字的位置信息,查找时扫描每个文档中字的信息知道找出所有包含查询关键字的文档
例如:
select * from table where id = 1; #查找表中id为1的数据
特点:
1、建立索引时结构较为简单,易于维护
2、查询的时候需对所有的文档进行扫描,检索效率低下
倒排索引:
以字或词为关键字进行索引,记录关键字所对应的所有文档ID,以及该文档的ID和关键词在该文档中出现的位置、词频等情况。
例如:
我是一个好人
嗯嗯是个好人
只要匹配到检索次都会命中数据
特点:
1、倒排表的建立和维护都较为复杂
2、查询效率高
es核心特点
1、索引
mysql也有索引概念:例如主键索引等等。。主要为了提升检索效率
在es中索引也是为了检索而定义任意多的索引
2、类型
为了对应关系型数据库,是讲索引对应为库,类型对应为表,文档当作数据行,将fild当成列
后面发现不适合意义不大,因为索引可以关联数据,就意味着在索引与数据增加一个概念,反而比较繁琐7.x以后版本已经不支持这个概念了
3、文档
存储数据,存储以json形式来保存
4、filed字段
5、映射mapping
规范索引,类似于mysql中的表结构,比如哪些字段可以被查询,哪些可以进行分词操作,等等
6、分片
类似于mysql分表,
例如一张用户表,我可以给分成男性用户,和女性用户存储,两个合起来就是完整数据。
重要点体现:
1、扩展容量:允许水平切割,来达到扩展容量的目的,相当于一张表在集群中,每个节点有一个分片来承担一些压力,相应就扩容了容量
2、提高吞吐量,假如说,我吧用户表分为男女两个分片来存储的话,如果合并在一起每秒只能能承担起10次请求,那么分开后两个节点就能承担起20次
7、副本
重要点主要体现在数据安全上
将数据分布在集群中时,并不能保证集群的每个节点都没问题,不会有突发情况导致节点挂掉,这种情况下有一个安全保障机制是非常有必要的,为此es允许你创建分片的一份或者多份副本拷贝,来保证数据的安全。
8、资源分配
分片分配给某个节点,或者副本的主从复制数据的过程,是由master节点来完成的
Analyzer(es检索时的分词过程)
analyzer的组成
char_filter:数据预处理
tokenizer:分词处理(分词器)
token_filter:数据后处理(停用词、同义词等。。)
Analyzer的实现过程char_filter->tokenizer->token_filter
es请求语句
索引
创建
http://127.0.0.1:9200/index_name PUT、DELETE
查询
http://127.0.0.1:9200/index_name GET/查看索引基本信息、创建时间、版本等等
http://127.0.0.1:9200/_cat/indices?v GET/查看所有索引信息
删除
http://127.0.0.1:9200/index_name DELETE/删除索引
文档
MAPPING(映射关系、理解为表结构)
创建
http://127.0.0.1:9200/index_name/「_doc」(添加文档数据的意思) post/好处是不管返回是否为幂等性都可执行不会报错
例如:
{
"key":"value",
"key":"value"
}
返回:
查询
http://127.0.0.1:9200/index_name/_search GET/全部查询
http://127.0.0.1:9200/index_name/_doc/1001 GET/根据唯一id查询
条件查询、分页查询、查询排序
#match_all:全部查询
#match:匹配查询(分词后匹配查询只要有分词命中即可返回)
#match_phrase:完全匹配(不分词匹配)参数:slop:2可以控制在两个字节以内的匹配数据也会返回
{
"query":{
"match":{
"key":"value"
}
},
"from":分页起始页,
"size":每页显示多少条,
"_source":[只展示某个字段],
"sort":{
"根据那个字段排序":{
"order":asc生序或desc降序
}
}
}
多条件查询、范围查询
{
"query":{
"bool":{ #bool:条件查询
"must":[ #must:and与(多条件同时成立) #should:or或(多条件成立一条即可) must_not:not非(条件不成立的数据)
"match":{
"key":"value"
},
"match":{
"key":"value"
},
],
"filter":{ #过滤
"range":{ #区间
"key":{
"gt":value #gt:大于,lt:小于
"gte":value #get:大于等于,lte:小于等于
}
}
}
}
}
}
聚合查询
terms:对某个字段进行统计
avg:统计平均值
{
"aggs":{ #聚合查询
"price_group":{ #随意起名,寓意组名
"terms":{ #分组
"field":"price" #分组使用那个字段
}
}
}
}
修改
http://127.0.0.1:9200/index_name/_update/唯一id POST/全量修改
{
"key":"value",
"key":"value"
}
http://127.0.0.1:9200/index_name/_update/唯一id POST/局部修改
{
"doc":{
"key":"value"
}
}
删除
http://127.0.0.1:9200/index_name/_doc/唯一id DELETE/删除id对应文档
环境
1、单机 & 集群
每个单机可以称为一个节点,而集群是由多个节点组成的。
单机的缺点:
1、容量限制(单个节点会根据硬件配置,当前宿主机基础配置等得到限制)
2、吞吐量限制(并发处理能力有限)
3、数据安全性
2、节点Node
一台宿主机理论上是可以启动多个节点的,但如果是单机部署集群的话,依旧会存在暴露出的问题,所以原则上一台宿主机运行一个节点保证集群的高可用
分片、副本使用概念
1、创建分片(特点:分片可以在初始化中指定数量,后面不能增加,副本可以)
增加副本示例:
2、集群分配分片与副本概念
原则一:主分片,与副本是不会放在一台机器上的
原则二:保证主分片与副本均匀分配在每个节点上
所谓均匀分配:
3、应对故障,某个节点,或master挂掉之后,集群的应对反应
4、分片路由计算规则(存储数据)
当数据进入集群是存储计算操作(存在那个主分片中)
hash(id % 主分片数据量 = 「0号分片、1号分片、2号分片」)
5、分片路由计算规则(search数据)
通过访问任何节点都可获取数据,去那个节点由master分配,一般轮询几个节点操作
6、向集群写入保存数据流程
1、客户端将请求发送给集群
2、集群通过分片路由计算,确定要保存在那个分片中
3、分片保存完成后,将数据同步给副本
4、副本包村完成后会告诉分片
5、分片再将保存完成信息反馈
6、最后将数据保存完成信息反馈给客户端
参数:
consistency:one(只要主分片状态ok就允许执行读、写操作),all(必须要主分片和所有副本分片的保存状态没问题才允许执行读、写操作)
timeout:如果没有足够的副本,es会等待,但如果等待时间过长,那么我们就可以使用这个参数使它可以更早终止,30s代表三十秒
7、向集群中search数据流程
1、客户端发送search请求给协调节点
2、协调节点轮循所有节点
3、将请求转接到具体节点
4、节点返回结果
es查看信息等,命令
查看es安装的所有插件
find / -name elasticsearch-plugin #可以先查找到elasticsearch-plugin文件然后elasticsearch-plugin list 查看安装的所有插件如果为空就是没有安装任何插件
query DSL匹配语句经验:
![image-20230103103000941](/Users/dg/Library/Application Support/typora-user-images/image-20230103103000941.png)
查看分词效果
#可以通过以下命令来查看分词效果
GET /_analyze
{
"analyzer": "standard",
"text": "我爱北京天安门"
}
GET _analyze
{
"analyzer": "ik_max_word",
"text": "我爱北京天安门"
}
GET _analyze
{
"analyzer": "ik_smart",
"text": "我爱北京天安门"
}
es写入优化
1、通过es提供的批量提交api
es有提供bulk api用来批量提交
bulk默认设置单次提交数据量不得超过100M,一般是根据文档大小或服务器性能决定的
2、优化存储设备-磁盘
ES是一个密集使用磁盘的数据库,当磁盘性能得到提高时,集群的整体性能也会得到提高
3、合理使用合并
lucene以段的形式存储数据,当有新的数据存入时,会创建一个新的段,而随着数据的增多,段数据也会随之累计,
4、加大flush
5、副本
es内存设置
修改config/jvm.options文件
Xmslg #初始启动的内存大小
Xmxlg #可分配的最大内存大小
内存指定原则
1、指定内存不要超过本机资源的50%。 例如32/16
2、最好保持一致
3、最好不要超过32G
集群中比较重要的配置
cluster.name #es集群名称(同一个集群下的节点集群名称必须为一致)
node.name #节点名称(同一个集群下node名称必须要有唯一性)
node.master #表示是否有资格称为master节点(具体能否成为master需要通过选举产生)
node.data #当前节点是否可以存储索引数据,如果true可以进行增删改查操作
index.number_of_shards #设置分片数量默认为1,也可以在创建索引时指定如果数据量不大,1个分片是最合适的
index.number_of_replicas #设置副本数量,也可以在创建索引是指定。
transpor.tcp.compress #设定在节点传输之间是否可以压缩,默认为false
discovery.zen.minimum_master_nodes #设置选举master节点时,需要参与的最少候选主节点数量,合理的数值为:
(master_elgibel_nodes2)+1
discovery.zen.ping.timeout #设置在集群中自动发现其他节点时,ping连接的超时时间,默认为3秒,网络环境较差
时可以设置的大一些,防止因误判该节点的存活状态而导致分片的转移
标签:索引,Elasticsearch,分片,集群,数据,节点,es
From: https://www.cnblogs.com/lzhpython/p/17681654.html