Elasticsearch
2022-02-25 18:06:22 36 举报
AI智能生成
登录查看完整内容
Elasticsearch
作者其他创作
大纲/内容
搜索是什么
单点,可用性低
扩展性差,需要自己维护集群和负载
特点
Lucene
搜索
基于Lucene的分布式的Restful风格的搜索、存储和分析引擎
基本定义
分布式:节点对等
高性能:近实时(NTR)搜索,支持处理PB级数据
高可用:容错性高
可伸缩:支持横向和纵向扩展
易维护:开箱即用,文档全面
面向开发者友好:屏蔽了Lucene的复杂特性
cluster discovery:集群自动发现
自动维护数据在多个节点上的建立
会帮助我们做请求的负载均衡
自动维护冗余副本,保证了部分节点宕机的情况下仍然不会有有数据的任何丢失
ES基于Lucene提供了很多高级的功能:复合查询、聚合分析、基于地理位置搜索等
对于大公司而言,可以构建几百台服务器的大型分布式架构,处理PB级别数据;对于小公司,开箱即用,门槛低上手简单。
相比传统数据库,提供了全文检索、同义词处理、相关度排名,聚合分析以及海量数据的近实时处理
优势
搜索引擎(全文检索、高亮、搜索推荐等)
用户行为日志(用户点击消费、浏览收藏、点赞评论等)
BI系统,数据分析
GItHub
ELK
应用领域
包含当前关键词的documentlist
关键词在每个document中出现的次数,即tern frequency(TF),TF越高,则匹配相关度越高
关键词在整个索引中出现的次数 inverse document frequency(IDF),IDF越高,则匹配相关度越低
关键词在当前document中出现的次数
每个doc的长度,越长相关度越低
包含这个关键词的所有doc的平均长度
数据结构
倒排索引
es官方是建议,es大量是基于os cache来进行缓存和提升性能的,不建议用jvm内存来进行缓存,那样会导致一定的gc开销和oom问题,给jvm更少的内存,给os cache更大的内存。比如64g服务器,给jvm最多4~16g(1/16~1/4),os cache可以提升doc value和倒排索引的缓存和查询效率
正排索引
cluster:集群
(一个节点≠一台服务器主机)
node:节点
field:数据字段
ES的最小数据单元,Json格式
document:文档
逻辑分类,ES 7.x取消了type的概念
type:类型
相同或者类似的document的集合
index:索引\t
再创建索引的时候,除非手动配置了primary shard的数量,否则es默认配置为5个primary,如果需要修改索引的primary的数量,需要重建索引
primary shard:主分片
es默认为每个primary shard分配一个replica shard,replica shard数量可动态修改
replica shard:副本分片
两种分片类型
每一个shard都是一个Lucene实例,具有完整的创建索引和处理搜索请求的能力
es会自动为我们做shard均衡
一个dicument不可能同时存在于多个primary shard中,但是可以同时存在于多个replica shard中
primary shard不能和他的replica shard存在于同一个节点,这不符合高可用的规范,因为一旦节点宕机,主副分片同时丢失,所以最小的可用配置是两个节点,互为主备
shard:分片
核心概念
ES在分配单个索引的分片时会将每个分片尽可能分配到更多的节点上。但是,实际情况取决于集群拥有的分片和索引的数量以及它们的大小,所以这种情况只是理想状况。
ES不允许Primary和它的Replica放在同一个节点中(为了容错),并且同一个节点不接受完全相同的两个Replica,也就是说,因为同一个节点存放两个相同的副本既不能提升吞吐量,也不能提升查询速度,徒耗磁盘空间。
每台节点的shard数量越少,每个shard分配的CPU、内存和IO资源越多,单个shard的性能越好,当一台机器一个Shard时,单个Shard性能最好。
(4)相同资源分配相同的前提下,单个shard的体积越大,查询性能越低,速度越慢
稳定的Master节点对于群集健康非常重要!理论上讲,应该尽可能的减轻Master节点的压力,分片数量越多,Master节点维护管理shard的任务越重,并且节点可能就要承担更多的数据转发任务,可增加“仅协调”节点来缓解Master节点和Data节点的压力,但是在集群中添加过多的仅协调节点会增加整个集群的负担,因为选择的主节点必须等待每个节点的集群状态更新确认。
如果相同资源分配相同的前提下,shard数量越少,单个shard的体积越大,查询性能越低,速度越慢,这个取舍应根据实际集群状况和结合应用场景等因素综合考虑
数据节点和Master节点一定要分开,集群规模越大,这样做的意义也就越大
数据节点处理与数据相关的操作,例如CRUD,搜索和聚合。这些操作是I / O,内存和CPU密集型的,所以他们需要更高配置的服务器以及更高的带宽,并且集群的性能冗余非常重要
于仅投票节不参与Master竞选,所以和真正的Master节点相比,它需要的内存和CPU较少。但是,所有候选节点以及仅投票节点都可能是数据节点,所以他们都需要快速稳定低延迟的网络
高可用性(HA)群集至少需要三个主节点,其中至少两个不是仅投票节点。即使其中一个节点发生故障,这样的群集也将能够选举一个主节点。生产环境最好设置3台仅Master候选节点(node.master = true\t node.data = true)
为确保群集仍然可用,集群不能同时停止投票配置中的一半或更多节点。只要有一半以上的投票节点可用,群集仍可以正常工作。这意味着,如果存在三个或四个主节点合格的节点,则群集可以容忍其中一个节点不可用。如果有两个或更少的主机资格节点,则它们必须都保持可用
高可用
脑裂:可能会产生多个Master节点
解决:discovery.zen.minimum_master_nodes=N/2+1
第一步:Master选举
第二步:Replica容错
第三步:尝试重启故障机
第四步:数据同步
容灾
ES分布式原理
创建索引:PUT /索引名称?pretty
查询索引:GET _cat/indices?v
删除索引:DELETE /msb_index?pretty
插入数据:
全量更新:使用PUT关键字,和插入数据格式相同,会完整替换原始数据
更新字段
更新数据
GET /product/_doc/_search\t查询所有
GET /product/_doc/1\t根据id查询
查询数据
CRUD
默认没有timeout,如果设置了timeout,那么会执行timeout机制
Timeout机制:假设用户查询结果有1W条数据,但是需要10″才能查询完毕,但是用户设置了1″的timeout,那么不管当前一共查询到了多少数据,都会在1″后ES讲停止查询,并返回当前数据。
用法:GET /_search?timeout=1s/ms/m
Searchtimeout
①查询所有:GET /product/_search
②带参数:GET /product/_search?q=name:xiaomi
③分页:GET /product/_search?from=0&size=2&sort=price:asc
Query_string
①match_all:匹配所有
②match:name中包含“nfc”
③sort:按照价格倒序排序
multi_match:根据多个字段查询一个关键词,name和desc中包含“nfc”的doc
_source 元数据:想要查询多个字段,例子中为只查询“name”和“price”字段。
⑥分页(deep-paging):查询第一页(每页两条数据)
Query DSL
Phrase search:短语搜索,和全文检索相反,“nfc phone”会作为一个短语去检索
query-term:不会被分词
②match和term区别:
③☆全文检索:
Full-text queries:全文检索
must:必须满足
filter:过滤器 不计算相关度分数,cache☆
3)should:可能满足 or
must_not:必须不满足 不计算相关度分数 not
5)minimum_should_match
bool:可以组合多个查询条件,bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值。
#首先筛选name包含“xiaomi phone”并且价格大于1999的数据(不排序),#然后搜索name包含“xiaomi”and desc 包含“shouji”
2)bool多条件 name包含xiaomi 不包含erji 描述里包不包含nfc都可以,价钱要大于等于4999
案例
minimum_should_match例子
嵌套查询:
Query and filter:查询和过滤
①想要一台带NFC功能的 或者 小米的手机 但是不要耳机
搜索一台xiaomi nfc phone或者一台满足 是一台手机 并且 价格小于等于2999
Compound queries:组合查询
Highlight search:高亮
(1)解释:当你的数据超过1W,不要使用
(2)返回结果不要超过1000个,500以下为宜
①尽量避免深度分页查询
②使用Scroll search(只能下一页,没办法上一页,不适合实时查询)
(3)解决办法:
Deep paging问题
Scroll search
查询
查看mapping:GET /product/_mapping
Dynamic mapping
exact value 精确匹配:在倒排索引过程中,分词器会将field作为一个整体创建到索引中,
full text全文检索:分词、近义词同义词、混淆词、大小写、词性、过滤、时态转换等(normaliztion)
精准匹配和全文检索
long
integer
short
byte
double
float
half_float
scaled_float
数字
date
date_nanos
日期
keyword
text
字符串
binary(二进制)
integer_range
float_range
long_range
double_range
date_range
range(区间类型)
核心类型
Object:用于单个JSON对象
Nested:用于JSON对象数组
复杂类型
Geo-shape:用于多边形等复杂形状
地理位置
IP地址:ip 用于IPv4和IPv6地址
Completion:提供自动完成建议
Tocken_count:计算字符串中令牌的数量
Murmur3:在索引时计算值的哈希并将其存储在索引中
Annotated-text:索引包含特殊标记的文本(通常用于标识命名实体
Percolator:接受来自query-dsl的查询
Join:为同一索引内的文档定义父/子关系
Rank features:记录数字功能以提高查询时的点击率。
Dense vector:记录浮点值的密集向量。
Sparse vector:记录浮点值的稀疏向量。
Search-as-you-type:针对查询优化的文本字段,以实现按需输入的完成
Alias:为现有字段定义别名。
Flattened:允许将整个JSON对象索引为单个字段。
Shape:shape 对于任意笛卡尔几何
Histogram:histogram 用于百分位数聚合的预聚合数值。
Constant keyword:keyword当所有文档都具有相同值时的情况的 专业化
特有类型
keyword当所有文档都具有相同值时的情况的 专业化
Constant keyword
Date_nanos:date plus 纳秒
Features:
Vector:as
ES 7新增:
数据类型
index
analyzer
boost
coerce
copy_to
doc_values
dynamic
eager_global_ordinals
enable
fielddata
fields
format
ignore_above
ignore_malformed
index_options
Index_phrases
Index_prefixes
meta
normalizer
norms
null_value
position_increment_gap
proterties
search_analyzer
similarity
store
term_vector
Mapping parameters
mapping
terms
aggs
聚合类型
聚合查询
GET /_mget
GET /<index>/_mget\t
语法
批量查询:_mget
POST /_bulk
POST /<index>/_bulk
PUT /index/_create/id/\t强制创建
create
删除(lazy delete原理)
delete
可以是创建,也可以是全量替换
执行partial update(全量替换,部分替换)
update
支持的操作类型 Operate
批量增删改:_bulk
依赖:JDK
下载地址:https://www.elastic.co/cn/downloads/elasticsearch
启动:Linux ./elasticsearch -d Windows: bin目录下双击elasticsearch.bat
验证:http://localhost:9200/
安装ES
Head插件:附件
Kibana:附件
开发模式:
生产模式:
开发模式和生产模式
环境
①_cat/health?v
cluster_name:集群名称
status:健康值状态
timed_out:是否超时
number_of_nodes:节点数量
number_of_data_nodes:数据节点数量
active_primary_shards:活跃的主分片数
active_shards:活跃的总分片数
relocating_shards:迁移中的分片数
initializing_shards:初始化中的分片数
unassigned_shards:未分配的分片数
active_shards_percent_as_number:活跃分片的百分比
_cluster/health
脚本
Green
Yellow
Red
健康值状态
健康值检查
node.master:是否为候选节点
node.data:是否为数据节点
discovery.zen.minimum_master_nodes:最小投票节点数
配置
Master:主节点
voting:投票节点
coordinating:协调节点
Master-eligible node:候选节点
Data node:数据节点
Ingest node
Machine learning node:机器学习节点
ES-node
集群
悲观锁
乐观锁
并发控制
底层原理及优化
Elasticsearch
0 条评论
回复 删除
下一页