Elasticsearch
2021-04-13 10:11:30 0 举报
AI智能生成
Elasticsearch 总结
作者其他创作
大纲/内容
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:数据字段
document:文档
ES的最小数据单元,Json格式
type:类型
逻辑分类,ES 7.x取消了type的概念
index:索引\t
相同或者类似的document的集合
shard:分片
两种分片类型
primary shard:主分片
再创建索引的时候,除非手动配置了primary shard的数量,否则es默认配置为5个primary,如果需要修改索引的primary的数量,需要重建索引
replica shard:副本分片
es默认为每个primary shard分配一个replica shard,replica shard数量可动态修改
每一个shard都是一个Lucene实例,具有完整的创建索引和处理搜索请求的能力
es会自动为我们做shard均衡
一个dicument不可能同时存在于多个primary shard中,但是可以同时存在于多个replica shard中
primary shard不能和他的replica shard存在于同一个节点,这不符合高可用的规范,因为一旦节点宕机,主副分片同时丢失,所以最小的可用配置是两个节点,互为主备
ES分布式原理
高可用
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选举
脑裂:可能会产生多个Master节点
解决:discovery.zen.minimum_master_nodes=N/2+1
第二步:Replica容错
第三步:尝试重启故障机
第四步:数据同步
语法
CRUD
创建索引:PUT /索引名称?pretty
查询索引:GET _cat/indices?v
删除索引:DELETE /msb_index?pretty
插入数据:
更新数据
全量更新:使用PUT关键字,和插入数据格式相同,会完整替换原始数据
更新字段
查询数据
GET /product/_doc/_search\t查询所有
GET /product/_doc/1\t根据id查询
查询
Searchtimeout
默认没有timeout,如果设置了timeout,那么会执行timeout机制
Timeout机制:假设用户查询结果有1W条数据,但是需要10″才能查询完毕,但是用户设置了1″的timeout,那么不管当前一共查询到了多少数据,都会在1″后ES讲停止查询,并返回当前数据。
用法:GET /_search?timeout=1s/ms/m
Query_string
①查询所有:GET /product/_search
②带参数:GET /product/_search?q=name:xiaomi
③分页:GET /product/_search?from=0&size=2&sort=price:asc
Query DSL
①match_all:匹配所有
②match:name中包含“nfc”
③sort:按照价格倒序排序
multi_match:根据多个字段查询一个关键词,name和desc中包含“nfc”的doc
_source 元数据:想要查询多个字段,例子中为只查询“name”和“price”字段。
⑥分页(deep-paging):查询第一页(每页两条数据)
Phrase search:短语搜索,和全文检索相反,“nfc phone”会作为一个短语去检索
Full-text queries:全文检索
query-term:不会被分词
②match和term区别:
③☆全文检索:
Query and filter:查询和过滤
bool:可以组合多个查询条件,bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值。
must:必须满足
filter:过滤器 不计算相关度分数,cache☆
3)should:可能满足 or
must_not:必须不满足 不计算相关度分数 not
5)minimum_should_match
案例
#首先筛选name包含“xiaomi phone”并且价格大于1999的数据(不排序),#然后搜索name包含“xiaomi”and desc 包含“shouji”
2)bool多条件 name包含xiaomi 不包含erji 描述里包不包含nfc都可以,价钱要大于等于4999
嵌套查询:
minimum_should_match例子
Compound queries:组合查询
①想要一台带NFC功能的 或者 小米的手机 但是不要耳机
搜索一台xiaomi nfc phone或者一台满足 是一台手机 并且 价格小于等于2999
Highlight search:高亮
Deep paging问题
(1)解释:当你的数据超过1W,不要使用
(2)返回结果不要超过1000个,500以下为宜
(3)解决办法:
①尽量避免深度分页查询
②使用Scroll search(只能下一页,没办法上一页,不适合实时查询)
Scroll search
mapping
查看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(二进制)
range(区间类型)
integer_range
float_range
long_range
double_range
date_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当所有文档都具有相同值时的情况的 专业化
Constant keyword
keyword当所有文档都具有相同值时的情况的 专业化
ES 7新增:
Date_nanos:date plus 纳秒
Features:
Vector:as
Mapping parameters
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
聚合查询
聚合类型
terms
aggs
批量查询:_mget
GET /_mget
GET /<index>/_mget\t
批量增删改:_bulk
POST /_bulk
POST /<index>/_bulk
支持的操作类型 Operate
create
PUT /index/_create/id/\t强制创建
delete
删除(lazy delete原理)
可以是创建,也可以是全量替换
update
执行partial update(全量替换,部分替换)
Scripting
painless
支持操作:delete、upsert、noop
参数化查询
Stored scripts
expression
mustache
java
分词
作用
切词
②normalization(提升recall召回率:能搜索到的结果的比率)
分析器
character filter:字符过滤
html_strip:过滤html标签
mapping:自定义字符映射
pattern_replace:正则替换
token filter
tokenizer:分词器
内置分词器
standard
其他14种
自定义分词器
中文分词器
IK
ik_smart:粗粒度
ik_max_word:细粒度
IK文件描述
安装
下载:https://github.com/medcl/elasticsearch-analysis-ik
创建插件文件夹 cd your-es-root/plugins/ && mkdir ik
将插件解压缩到文件夹 your-es-root/plugins/ik
重新启动es
IKAnalyzer.cfg.xml:词库配置文件
词库文件
主词库:main.dic
英文停用词:stopword.dic
quantifier.dic:特殊词库:计量单位等
suffix.dic:特殊词库:后缀名
surname.dic:特殊词库:百家姓
preposition:特殊词库:语气词
热更新
修改源码
环境
安装ES
依赖:JDK
下载地址:https://www.elastic.co/cn/downloads/elasticsearch
启动:Linux ./elasticsearch -d Windows: bin目录下双击elasticsearch.bat
验证:http://localhost:9200/
Head插件:附件
Kibana:附件
开发模式和生产模式
开发模式:
生产模式:
集群
健康值检查
脚本
①_cat/health?v
_cluster/health
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:活跃分片的百分比
健康值状态
Green
Yellow
Red
配置
node.master:是否为候选节点
node.data:是否为数据节点
discovery.zen.minimum_master_nodes:最小投票节点数
ES-node
Master:主节点
voting:投票节点
coordinating:协调节点
Master-eligible node:候选节点
Data node:数据节点
Ingest node
Machine learning node:机器学习节点
底层原理及优化
并发控制
悲观锁
乐观锁
0 条评论
回复 删除
下一页