Elasticsearch
2020-12-14 16:49:12 0 举报
AI智能生成
ES学习总结
作者其他创作
大纲/内容
扩展
插件开发
security
analysis
alerting
api扩展
management
mapper
scripting
backup/restore
原理
lucence
每个shard都是一个最小工作单元,承载部分数据,每个shard都是一个lucene实例,都有完整的建立索引和处理请求的能力。
analysis 模块
词法分析及语言处理,也就是我们常说的分词,通过这个形成最小的存储/搜索单元
index 模块
创建index
store模块
存储
queryParse模块
语法分析
search模块
搜索
similarity模块
打分排序
核心概念
Index(索引)
Document(文档)
Sequence Number
Field(字段)
FieldType
stored: 代表是否需要保存该字段,如果为false,则lucene不会保存这个字段的值,而搜索结果中返回的文档只会包含保存了的字段。
tokenized: 代表是否做分词,在lucene中只有TextField这一个字段需要做分词。
termVector: http://makble.com/what-is-term-vector-in-lucene 很好的解释了term vector的概念,简单来说,term vector保存了一个文档内所有的term的相关信息,包括Term值、出现次数(frequencies)以及位置(positions)等,是一个per-document inverted index,提供了根据docid来查找该文档内所有term信息的能力。对于长度较小的字段不建议开启term verctor,因为只需要重新做一遍分词即可拿到term信息,而针对长度较长或者分词代价较大的字段,则建议开启term vector。Term vector的用途主要有两个,一是关键词高亮,二是做文档间的相似度匹配(more-like-this)。
omitNorms: Norms是normalization的缩写,lucene允许每个文档的每个字段都存储一个normalization factor,是和搜索时的相关性计算有关的一个系数。Norms的存储只占一个字节,但是每个文档的每个字段都会独立存储一份,且Norms数据会全部加载到内存。所以若开启了Norms,会消耗额外的存储空间和内存。但若关闭了Norms,则无法做index-time boosting(elasticsearch官方建议使用query-time boosting来替代)以及length normalization。
indexOptions: Lucene提供倒排索引的5种可选参数(NONE、DOCS、DOCS_AND_FREQS、DOCS_AND_FREQS_AND_POSITIONS、DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS),用于选择该字段是否需要被索引,以及索引哪些内容。
docValuesType: DocValue是Lucene 4.0引入的一个正向索引(docid到field的一个列存),大大优化了sorting、faceting或aggregation的效率。DocValues是一个强schema的存储结构,开启DocValues的字段必须拥有严格一致的类型,目前Lucene只提供NUMERIC、BINARY、SORTED、SORTED_NUMERIC和SORTED_SET五种类型。
dimension:Lucene支持多维数据的索引,采取特殊的索引来优化对多维数据的查询,这类数据最典型的应用场景是地理位置索引,一般经纬度数据会采取这个索引方式。
term
索引的最小存储/查询单元,一般指分词后的一个词
字典/词典 Term Dictionary
term的集合
词典需要常驻内存
字典的数据结构有很多种
排序数组
二分查找检索索引
HashMap结构
比排序数组更快,就牺牲空间
Finite-state transducer
fst 有比较好的压缩率和查询效率,默认使用这个
倒排表 Posting List
记录一个词,在原文(就是上面的field(字段)的docID即sequence number)的哪个位置出现过
原文信息
原始文档,用来排序,聚合,展示
段 segment
一个索引文件由一个或多个段组成,段具有不变性,一旦生成只能读,不能写
lucence是分段存储的
新增
创建一个新的段来存储新的数据
删除
新增一个.del文件,存储被删除数据的DocId,当查询的时候,被删除的数据还是会被查出来。
只是在文档链合并的时候,把删除的数据给过滤掉
只是在文档链合并的时候,把删除的数据给过滤掉
被删除的数据只有段合并的时候才会被真正删除掉
更新
新增和删除的组合。
现在.del文件中记录旧的数据DocId,再新的段中新增一条更新后的数据
现在.del文件中记录旧的数据DocId,再新的段中新增一条更新后的数据
段采用延时策略,在内存中暂存1s或者段的数据量够大的时候,才会批量提交到磁盘中。
默认时间和数据量的大小可以通过参数修改。
默认时间和数据量的大小可以通过参数修改。
lucence存在丢失数据的可能,为此ES添加了事务来保证数据的安全。
lucence存在丢失数据的可能,为此ES添加了事务来保证数据的安全。
段合并策略
mergeFactor
每次合并时参与合并的段最少数量,当一个组的段的数量达到时,开始合并,小于此值就不合并
默认10
segmentSize
段的实际大小,为字节
minMergeSize
小于这个值的段就会被分到一组,加速小片段的合并
检索过程
见《可伸缩服务架构:框架与中间件》271页
一个查询请求在集群处理的流程
有id的查询
(1)客户端向集群发送查询请求,集群随机选择一个节点做协调节点(coordinating node)负责这次查询任务
(2)协调节点通过routing id计算文档在哪个shard上,可以指定到replica shard。
(3)协调节点将请求发送给对应的shard之后,对应的shard查询结果返回给 协调节点,协调节点返回请求给客户端
普通查询,不走主键,无法知道数据在哪个分片上
深度分页问题
PUT /index/type/id 在集群处理流程
一般对应到应用程序中,每次的执行流程基本是这样的:
只有primary shard能处理写请求
我们能知道请求的数据在哪个分片上,因为我们一开始就定义了分片的数目,并且不能改动分片数目。
通过 shard = hash(routing) % number_of_primary_shards 确定是第几个分片。
集群中节点都知道集群中文档存放的位置。所以每个节点都能处理读写请求,而处理请求的节点称为协调节点(coordinating Node)
协调节点负责将请求转发到该分片的主分片上。
通过 shard = hash(routing) % number_of_primary_shards 确定是第几个分片。
集群中节点都知道集群中文档存放的位置。所以每个节点都能处理读写请求,而处理请求的节点称为协调节点(coordinating Node)
协调节点负责将请求转发到该分片的主分片上。
(1)然后发送PUT请求,到es中node1,进行全量替换
(2)通过文档的_id来确认文档在哪个分片,请求转发到对应的节点
(3)对应的节点node在主分片上执行成功,如果成功,则将请求转发给自己的replica,当一致性指定的replica数量以上的replica执行拱了,协调节点才会返回客户端成功了。
partial update 在集群 处理流程
1)内部获取document
2)将传过来的field更新到查询的document json
3)将老的document 标记为 deleted
4)将修改后新的document创建出来
乐观锁实现
核心概念
物理视角
集群
集群的健康状况
green、yellow、red
green:每个索引的primary shard和replica shard都是active状态的
yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了。
横向扩容
1. 机器越多只要不是强一致性读写,性能越好
2. 扩容的极限是一台机器一个shard
比如我有3个primary shard,6个replica shard,那么扩容的极限就是9台机器
比如我有3个primary shard,6个replica shard,那么扩容的极限就是9台机器
容错
比如我有3台机器
我有3个primary shard,6个replica shard
我有3个primary shard,6个replica shard
1、图解Elasticsearch容错机制:master选举,replica容错,数据恢复
(1)9 shard,3 node,分布如下:
(1)9 shard,3 node,分布如下:
(2)master node宕机,自动master选举,red
master node宕机的一瞬间,P0这个primary shard就没了,此时不是active status, 就是所有的primary shard都是active的。
容错第一步: master选举,自动选举另外一个node成为新的master,承担起master得责任来。
容错第二步:新master将丢失掉的primary shard的某个replica shard提升为primary shard,此时cluster status会变成yellow,因为primary shard全都变成active了,但是,少了一个replica shard,所以不是所有的replica shard都是active的了。
容错第三步:重启宕机node,master copy replica到该node,使用原有的shard并同步宕机后的修改,green。
容错第一步: master选举,自动选举另外一个node成为新的master,承担起master得责任来。
容错第二步:新master将丢失掉的primary shard的某个replica shard提升为primary shard,此时cluster status会变成yellow,因为primary shard全都变成active了,但是,少了一个replica shard,所以不是所有的replica shard都是active的了。
容错第三步:重启宕机node,master copy replica到该node,使用原有的shard并同步宕机后的修改,green。
怎么扩容,怎么提升系统整体吞吐量的同时;怎么保证提高容错性,让尽可能多的服务器宕机,保证数据不丢失?
节点
master node
1. 创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。
2. 维护并更新 cluster state
稳定的主节点对集群的健康是非常重要的,默认情况下任何一个集群中的节点都有可能被选为主节点,索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。
使用低配置cpu,ram和磁盘
data node
保持分片数据
使用高配置cpu,ram和磁盘
ingest node
默认每个节点打开
做数据预处理,可以理解index或者布莱克 api请求
可以对数据转换重新返回给index或者bulk api
无需logstash 就可以对数据进行预处理
例如:为某个字段设置默认值,重命名某个字段的字段名,对字段值进行split,支持painless脚本,对数据的复杂加工
使用高配置cpu,中等ram,低配置磁盘
coordinating node
machine learning
特殊节点类型
Hot & Warm NOde
冷热节点
ML node
机器学习的节点
Tribe Node
部落节点
分片
primary shard
一个分片就是一个lucene实例
主分片一旦指定不能修改,除非reindex
replica shard
可以动态调整
逻辑视角
索引
文档
_all metadata的原理和作用
分布式架构
3C
Consensus
共识性
Zen discovery共识系统
gossip传输数据,实现单播,节点间一对一通信
Concurrency
并发
es使用的乐观锁实现并发控制
乐观锁
partial update内部会自动执行乐观锁概念。
retry策略
example
Consistency
一致性
我们在发送任何一个增删改操作的时候,比如说put /index/type/id,都可以带上一个consistency参数,指明我们想要的写一致性是什么?
put /index/type/id?consistency=quorum
put /index/type/id?consistency=quorum
ES支持Quorum NWR算法
one(primary shard)
要求我们这个写操作,只要有一个primary shard是active活跃可用的,就可以执行
all(all shard)
要求我们这个写操作,必须所有的primary shard和replica shard都是活跃的,才可以执行这个写操作
quorum(default)
默认的值,要求所有的shard中,必须是大部分的shard都是活跃的,可用的,才可以执行这个写操作
分片的原理
shard
replica
集群选主的流程
Zen discovery
集群通过ping命令来保持连通,ping不通就认为master发生了故障
发生了故障之后nodeId小的会成为新的master
其他节点加入集群都是不担任master节点的角色。一旦发现master丢失,就会选出新的master节点
discovery.zen.minimum_master_nodes=1
设置最小选主的节点数,默认是1,使用默认值很容易脑裂
discovery.zen.ping.timeout: 3s 设置在集群中发现其它节点时ping连接的超时时间
避免脑裂
discovery.zen.minimum_master_nodes=(master_eligible_nodes/2)+ 1
半数的节点认为master可用才进行选举
es7之后无需配置
移除minimum_master_nodes参数,让es自己选择可以形成仲裁节点
文档读写流程
节点故障转移
分片:主分片和副本分片
master自动选primary shard转移到还存活的node上
分布式搜索
事务日志 translog
提高高可用
translog是elasticsearch的事务日志文件
translog是用来恢复数据的。
执行步骤
1)将内存中的数据刷新到一个段中,该段还在内存中,缓存在操作系统的文件缓存系统中
注意是缓存系统,而不是jvm内存
这个时候,段只能读,不能写
2)打开保存在文件系统缓存的段,让其可以被搜索
这也是es近实时的根本原因
3)清空内存,接受新的数据,日志不做清空处理
后台线程检测日志大小超过512MB或者时间超过30min,触发刷新
1)文件缓存系统创建一个新的段,并将内存中的数据写入,使其可以被搜索
2)清空内存,准备接受新的数据
3)将文件缓存中的数据通过fsync 刷新到硬盘中
4)生成提交点
5)删除旧的日志,创建一个空的日志
搜索引擎
倒排索引
example
倒排索引分两部分
Term Dictionary :词典
Posting List:倒排表
文档Id
词频TF-该单词在文档中出现的次数,用于相关性评分
位置 position
单词在文档中分词的位置,用于语句搜索
偏移量 offset
记录单词开始结束的位置,实现高亮
example
搜索相关性
相关度算分
TF-IDF/BM25
向量空间模型/余弦定律
相关度指标
precision
尽可能返回较少的无关文档
recall
尽可能返回较多的相关性文档
Ranking
是否能够安装相关度进行排序
运维
使用celebro来监控es
集群部署与水平扩展
容量规划
需要确定的内容
一个集群需要多少个节点,一个索引需要多少个分片
单条文档的尺寸/文档的总数据量/索引的总数据量(Time base 数据保留的时间)/副本分片数
文档是如何写入的(Bluk的尺寸)
文档的负责程度,如何读取(聚合查询还是普通查询)
业务性能需求评估
数据写入吞吐量
查询吞吐量
单条最大返回值
数据的格式和数据的Mapping
实际查询和聚合长什么样子
ES主要分两类应用
日志类搜索
基于时间序列的数据
使用ES存放日志/性能指标,数据每天不断写入,增长速度较快
结合Warm Node做数据的老化处理
业务数据类搜索
固定大小的数据集
搜索的数据集增长相对比较缓慢
硬件配置
业务数据类搜索
选择合理的硬件,业务数据节点尽可能是ssd
搜索等性能要求高的场景,建议使用ssd
建议按照1:10 比例配置内存和硬盘
日志/性能,查询并发需求地的场景
考虑使用机械硬盘
按照1:50 的比例配置内存和硬盘
单节点硬盘建议控制在2TB内,最大不超过5TB
JVM配置留一半的内存给系统,因为segment同步到文件系统的缓存。 jvm最大不建议超过32gb
集群部署方式
提高高可用和可靠性,可以考虑master 和 data节点分离,3master,3data,如果有复杂的查询和聚合,建议设置专门的coordinating节点
注意脑裂
es容量规划建议
每个shard 不超过20gb
在单机存储1TB数据场景下,SATA盘和SSD盘的全文检索性能对比(测试环境:Elasticsearch5.5.3,10亿条人口户籍登记信息,单机16核CPU、64GB内存,12块6TB SATA盘,2块1.5 TB SSD盘):
https://www.elastic.co/guide/en/elasticsearch/guide/current/capacity-planning.html
节点
master node
1. 创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。
2. 维护并更新 cluster state
使用低配置cpu,ram和磁盘
data node
保持分片数据
使用高配置cpu,ram和磁盘
ingest node
默认每个节点打开
使用高配置cpu,中等ram,低配置磁盘
coordinating node
machine learning
特殊节点类型
Hot & Warm NOde
冷热节点
ML node
机器学习的节点
Tribe Node
部落节点
分片的配置与优化
7.0 primary 分片默认改成了1
当 分片数 > 节点数时,一旦集群中有新的节点加入,分片就可以自动进行分配,建议 primary shards > nodes
日志类应用,单分片不要超过50gb
业务类应用,单分片不要超过20gb
副本也会占用资源,建议使用1就好,可以增加replica,增加读的吞吐量
避免分布不均匀
如果某个节点磁盘满了,新的节点加入,可能分片会集中到新的节点去,可以设置下面的值避免这个问题
index.routing.allcation.total_shards_per_node
cluster.routing.allcation.total_shards_per_node
性能测试
es-rally
es公司开发的
合理的部署架构
小集群
三master
三data
大的集群
多数据中心,异地多活
Hot & Warm 架构
分片的配置与优化
7.0 primary 分片默认改成了1
当 分片数 > 节点数时,一旦集群中有新的节点加入,分片就可以自动进行分配,建议 primary shards > nodes
日志类应用,单分片不要超过50gb
业务类应用,单分片不要超过20gb
副本也会占用资源,建议使用1就好,可以增加replica,增加读的吞吐量
避免分布不均匀
如果某个节点磁盘满了,新的节点加入,可能分片会集中到新的节点去,可以设置下面的值避免这个问题
index.routing.allcation.total_shards_per_node
cluster.routing.allcation.total_shards_per_node
时间序列数据的管理与优化
配置跨集群
集群备份与升级
滚动升级
重启升级
数据备份与恢复
集群安全
身份认证与鉴权
集群内部数据加密
集群外部数据加密
基于云计算的集群运维
公有云
Elastic Cloud
阿里云
私有云
基于虚拟机自建管理平台
operator on k8s
ECE-Elastic Cloud Enterprise
集群监控
Stats API
Canvas 画数据,适合大屏,电视屏项目
Task monitoring
Cluster API
CAT API
es提供了一套api,叫做cat api,可以查看es中各种各样的数据
GET /_cat/health?v
GET /_cat/indices?v
GET /_cat/indices?index=demo*
#查看indices
GET /_cat/indices/kibana*?v&s=index
#查看状态为绿的索引
GET /_cat/indices?v&health=green
#按照文档个数排序
GET /_cat/indices?v&s=docs.count:desc
#查看具体的字段
GET /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs.count,mt
#How much memory is used per index?
GET /_cat/indices?v&h=i,tm&s=tm:desc
X-Pack monitoring & Alerting
docker-compose安装es,kibana,cerebro
诊断与问题排查
索引配置诊断
分片配置诊断
内存和垃圾回收问题
集群状态变黄及变红的诊断与修复
1. 找出变红的索引
2. Explain 变红的原因
集群变红的常见问题
reroute
集群性能优化
索引读写优化
写
设置 replication=async
让索引异步同步到replica shard,提高写的效率
让索引异步同步到replica shard,提高写的效率
批量提交
bluk
一次提交的大小应该是5MB~15MB,逐渐增加,知道性能没有提升
合理使用段合并
使用ssd可以将段合并的大小改到100m/s
如果不考虑读的性能,可以关闭限制
可以使用来倒流,倒完之后,一定应该改回merge
减少refresh 的次数
es默认1s将segment flush到文件缓存系统,对时效性不高,可以改为30s
index.refresh_interval:30s
index.refresh_interval:-1
关闭
Flush
当translog到512MB的时候,可增加一倍到1GB,但是必须保证内存空间
index.translog.flush_threshold_size:1GB
减少副本的数量
index.number_of_replicas : 0
大批量写入
读
scroll api
避免大结果集合
避免深度分页
example
scroll进行的时候会拿着文件句柄,所以我们一定要设置一个超时时间和如果确认不使用了,记得清除
scroll-scan
这个比scroll不同之处:关闭了最耗时的 排序和文本相识度计算,性能更高效
scoll-scan不支持聚合操作
es5已经移除这个功能
我们可以使用 scroll 的sort后面加上对_doc的排序来实现类似的功能
选择合适的路由
尽量使用主键来查询
有id的查询
(1)客户端向集群发送查询请求,集群随机选择一个节点做协调节点(coordinating node)负责这次查询任务
(2)协调节点通过routing id计算文档在哪个shard上,可以指定到replica shard。
(3)协调节点将请求发送给对应的shard之后,对应的shard查询结果返回给 协调节点,协调节点返回请求给客户端
普通查询,不走主键,无法知道数据在哪个分片上
深度分页问题
searchType
在 fetch pharse 阶段悬着合适的方式
QUERY_THEN_FETCH
默认方式
QUERY_AND_FETCH
协调节点请求所有分片,分片会返回文档相似度高的文档,和文档的详细信息一起返回,协调节点自己整合,然后返回给客户端
没有二次请求,性能可能是 最好的
DFS_QUERY_THEN_FETCH
整体操作和QUERY_THEN_FETCH一样,但是有一个额外的全局词打分,QUERY_THEN_FETCH还只是shard内打分,性能更差
DFS_QUERY_AND_FETCH
与 QUERY_AND_FETCH 类型,全局打分
定期删除
.del文件也会参与检索,.del文件过多也会影响性能
参考《可伸缩服务架构:框架与中间件》271页
POST /{index}/_optimize?only_expunge_deletes=true&wait_for_completion=true
_optimize命令可强制进行segment合并,并删除所有标记为删除的文档。Segment merging要消耗CPU,以及大量的I/O资源,所以一定要在你的ElasticSearch集群处于维护窗口期间,并且有足够的I/O空间的(如:SSD)的条件下进行;否则很可能造成集群崩溃和数据丢失。
_optimize命令可强制进行segment合并,并删除所有标记为删除的文档。Segment merging要消耗CPU,以及大量的I/O资源,所以一定要在你的ElasticSearch集群处于维护窗口期间,并且有足够的I/O空间的(如:SSD)的条件下进行;否则很可能造成集群崩溃和数据丢失。
es 7不见了
读优化
硬盘
使用ssd
使用raid0,磁盘阵列第一个盘
在es的服务器上挂载多个硬。在elasticsearch.yml 中配置多个存储路径,例如:path.data: /path/to/data1, /path/to/data2
这样就可以在多个磁盘上进行读写了
这样就可以在多个磁盘上进行读写了
尽量不要使用nfs(network file system)远程存储设备,这些设备的延时对性能影响很大
堆大小设置
堆最小5gb
堆最大不要超过32gb
最好不要超过物理内存的50%
因为要留部分内存给文件系统缓存
服务器配置
关闭 swap
暂时关闭
sudo swapoff -a
永久关闭
/etc/sysctl.conf文件添加如下参数
vm.swappiness = 1
vm.swappiness = 1
集群
角色分离(生产环境一般是角色分离)
候选master节点
node.master=true
node.data=false
node.master=true
node.data=false
数据节点
node.master=false
node.data=true
node.master=false
node.data=true
使用
时间格式问题
深度搜索问题
基本概念
为搜索而生
Elasticsearch的功能,干什么的
分布式的搜索引擎和数据分析引擎
全文检索,结构化检索,数据分析
对海量数据进行近实时的处理
lucence的一个封装
使用curd的restful接口做对接
自动维护数据分片到不同的节点
shard
primary shard
自动冗余副本数据
replica
replica shard
近实时
Near Realtime(NRT)
近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级
Cluster
集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常
Node
节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群
Index
可以类比mysql的库,es的一个数据单元
包含一堆有相似结构的文档数据
Type
es8删除
类比mysql的表
Document&field:文档
es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。
类比数据库
类比数据库
类比数据库
类比数据库
索引 type
索引是相似文档的集合
type类型解释
es7中合法的type是 _doc
es8删除
基本操作
创建索引
自动创建索引
手动创建索引
声明结构
删除索引
数据建模
对索引建模
时间序列数据
对文档建模
嵌套字段
父子文档
Mappings & Settings
mapping定义文档字段的类型
创建mapping
官方手册 Mapping Parameters
text 类型声明索引时,索引四个级别
index_options
1) docs 记录 doc id
2)freqs 记录doc id和term frequencies
3)positions 记录 doc id / term frequencies / term position
4)offsets - 记录 doc id / term frequencies / term position / character offsets
默认是 docs
记录内容越多,占用储存空间越大
null_value
需要对null值进行搜索时,将null指定为"NULL"
_all 功能被移除了,可以使用copy_to 实现
copy_to不会出现在_source中
数组
exact value vs full-text
exact value 精确值
不需要做分词处理
full-text 全文本
查看mapping
`GET /index/_mapping/type`
增加字段并且声明mapping的格式
mapping的建过程
1)往es里面直接插入数据,es会自动建立索引,同时建立type以及对应的mapping
2)mapping中就自动定义了每个field的数据类型
3)不同的数据类型(比如说text和date),可能有的是exact value,有的是full text
4)exact value,在建立倒排索引的时候,分词的时候,是将整个值一起作为一个关键词建立到倒排索引中的;full text,会经历各种各样的处理,分词,normaliztion(时态转换,同义词转换,大小写转换),才会建立到倒排索引中
5)同时呢,exact value和full text类型的field就决定了,在一个搜索过来的时候,对exact value field或者是full text field进行搜索的行为也是不一样的,会跟建立倒排索引的行为保持一致;比如说exact value搜索的时候,就是直接按照整个值进行匹配,full text query string,也会进行分词和normalization再去倒排索引中去搜索
6)可以用es的dynamic mapping,让其自动建立mapping,包括自动设置数据类型;也可以提前手动创建index和type的mapping,自己对各个field进行设置,包括数据类型,包括索引行为,包括分词器,等等
mapping root object 的元数据
properties
_source
_all metadata的原理和作用
6.x版本_all为禁用,并且创建了索引之后不能动态改动,只能在创建索引的时候先声明好
7.0 废除
关闭`_all`
store
store属性用于指定是否将原始字段写入索引,默认取值为no。如果在Lucene中,高亮功能和store属性是否存储息息相关,因为需要根据偏移位置到原始文档中找到关键字才能加上高亮的片段。在Elasticsearch,因为_source中已经存储了一份原始文档,可以根据_source中的原始文档实现高亮,在索引中再存储原始文档就多余了,所以Elasticsearch默认是把store属性设置为no。
注意:如果想要对某个字段实现高亮功能,_source和store至少保留一个。下面会给出测试代码。
标识性metadata
`_index`,`_type`,`_id`
Field Datatypes
简单类型
full-text
text
analyzed : 建立索引
not_analyzed: 不分词
no: 不能索引,不能搜索
not_analyzed: 不分词
no: 不能索引,不能搜索
exact value string
keyword
byte,short,integer,long
float,double
boolean
bool
date
byte,short,integer,long
float,double
bool
date
es 5.5之后string类型去除,解决: string替换为text或者keyword
es 5.5之后index类型改为bool
层级关系
object field
特殊类型
geo
percolator
Multi-Fields
{ "tags": [ "tag1", "tag2" ]}
建立索引时与string是一样的,数据类型不能混
empty field
null,[],[null]
Dynamic Mapping
自动创建索引,put数据的时候自动创建索引,可以关闭
定制自己的dynamic mapping 策略
true:遇到陌生字段,就进行dynamic mapping
false:遇到陌生字段,就忽略
strict:遇到陌生字段,就报错
Dynamic Template
定制自己的dynamic mapping template(type level)
Index Template
帮助你设定mappings和settings,并且按照一定的规则,自动匹配到新创建的索引之上
模板仅仅在一个索引上被新创建的时候才其作用。修改模板不会影响已经创建的索引
可以设置多个模板,这些设置会被merge在一起
可以 指定order的数量,控制merging的过程
settings
setting定义不同的数据分布
number_of_shards
number_of_replicas
修复数据
使用pipeline加工数据
使用Painless Script加工数据
Reindex 重建索引
修改字段类型
修改primary 数目
_source 必须打开
example
跨集群reindex
配置yaml文件
Update By Query
为索引增加子字段
example
文本Analysis:分词器
切分词语,normalization,切分之后能提高召回率。
recall,召回率:搜索的时候,增加能够搜索到的结果的数量。
一个分词器,很重要,将一段文本进行各种处理,最后处理好的结果才会拿去建立倒排索引
Analyzer的组成
Character Filter 清洗数据
在一段文本进行分词之前,先进行预处理,比如说最常见的就是,过滤html标签(<span>hello<span> --> hello),& --> and(I&you --> I and you)
es自带的
html strip
去除html标签
mapping
字符串替换
pattern replace
正则表达式替换
Tokenizer 拆分语句
分词,hello you and me --> hello, you, and, me
es自带的
whitespace
standard
uax_url_email
pattern
Token Filter 改造数据+过滤数据
lowercase,stop word,synonymom,dogs --> dog,liked --> like,Tom --> tom,a/the/an --> 干掉,mother --> mom,small --> little
改造数据
1)将数据变成小写
2)找数据的近义词
过滤数据
拆词器遇到这种词直接过滤掉
es自带的
lowercase
stop
synonym
近义词
执行步骤:character filter, tokenizer, token filter
内置Analyzer
比如对 Set the shape to semi-transparent by calling set_trans(5) 拆词
standard analyzer
set, the, shape, to, semi, transparent, by, calling, set_trans, 5(默认的是standard)
simple analyzer
set, the, shape, to, semi, transparent, by, calling, set, trans
whitespace analyzer
Set, the, shape, to, semi-transparent, by, calling, set_trans(5)
language analyzer(特定的语言的分词器,比如说,english,英语分词器)
set, shape, semi, transpar, call, set_tran, 5
使用Anayze API测试
GET /_analyze
自定义Analyzer
修改分词器
多语言分词器
中文分词器
ik
拼音分词器
混合语言
索引管理
Index Alias
Shrink / Split /Rollover
Shrink
扩展分片
索引分片设置大了,想缩小
Rollover
索引数据过大的时候,想扩大
主要针对时序索引
Open / Close API
关闭index之后就不能查询了
Lifecycle Management Policy
文档
文档元数据
_index
文档所属的索引名
_type
文档所属的类型名
_id
文档的唯一id
_source
文档的原始json数据
_all
整合所有的字段到该字段,在7.0已经废除
_version
文档版本信息
_score
相关性打分
创建文档
PUT /index/type/id
{
"json数据"
}
{
"json数据"
}
更新文档
增量更新
全量更新
删除文档
查询文档
GET _search
详细说明
timeout
GET /_search?timeout=10m
preference
决定了哪些shard会被用来执行搜索操作
所谓的 bouncing results 问题: 每次用户刷新页面,搜索结果表现是不同的顺序。 让同一个用户始终使用同一个分片,这样可以避免这种问题, 可以设置 preference 参数为一个特定的任意值比如用户会话ID来解决。
解决方案就是将preference设置为一个字符串,比如说user_id,让每个user每次搜索的时候,都使用同一个replica shard去执行,就不会看到bouncing results了
example
routing
document文档路由,_id路由,routing=user_id,这样的话可以让同一个user对应的数据到一个shard上去
路由算法
路由算法:shard = hash(routing) % number_of_primary_shards
example
put /index/type/id?routing=user_id
search_type
默认是default:query_then_fetch。
dfs_query_then_fetch,可以提升revelance sort精准度。
uri query
#基本查询
GET /index/type/id
GET /index/_count
查看索引数据量
query string search
泛查询,正对_all,所有字段
指定字段
其他
Request Body : query dsl
dsl
example
带profile,能查看具体的查询执行过程
带explain,能查看分词的过程
query exact value
exact value
2017-01-01,exact value,搜索的时候,必须输入2017-01-01,才能搜索出来,如果你输入一个01,是搜索不出来的。
query filter
example
query:是会计算doc对搜索条件的relevance score,还会根据这个score去排序
filter:只是简单过滤出想要的数据,不计算relevance score,也不排序
range 查询
example
example2
exists 查询
模糊匹配
prefix 查询
wildcard查询
regexp 查询
fuzzy 查询
common terms query
example
(1)term filter:根据exact value进行搜索,数字、boolean、date天然支持
(2)text需要建索引时指定为not_analyzed,才能用term query
(3)相当于SQL中的单个where条件
(2)text需要建索引时指定为not_analyzed,才能用term query
(3)相当于SQL中的单个where条件
example2
(1)terms多值搜索
(2)优化terms多值搜索的结果
(3)相当于SQL中的in语句
example3
1) term 是对最小单位查询,只是不分词处理,不是不进行相关性查询了,比如:两个单词大小写不同,使用term还是会返回的
2)如果希望跳过相关性分析,可以使用constant_score转成filter,进行查询
结构化查询
结构化的数据
bool,日期,数字
针对结构化的数据进行查询称为结构化查询
结构化搜索可以使用
term查询
preifx前缀查询
query full-text search
example
执行过程
2017-01-01,2017 01 01,搜索2017,或者01,都可以搜索出来。
什么是full-text查询
query string
simple query string
match query
match pharse
example
match phrase prefix
multi-match query
单字符串多字段查询:Multi Match
most_fields
best_fields
最匹配的字段
example
支持使用operator
intervals query
join 查询
nested
hash child / parent query
parent id query
复合查询
constant score
开启不算分,转换为filter过滤
bool query
example
算分过程
四个子语句
must
必须匹配
数组,可以填多个条件
must_not
必须不匹配
should
数组,可以填多个条件
和must相反,这个多个条件是or,must是and
filter
顺序随意
可以嵌套多个
dis max query
examples
将任何与任一查询匹配的文档作为结果返回。采用字段上最匹配的评分最终评分返回
dis_max只取某一个query最大的分数,完全不考虑其他query的分数
tie_breaker
tie_breaker参数的意义,在于说,将其他query的分数,乘以tie_breaker,然后综合与最高分数的那个query的分数,综合在一起进行计算
除了取最高分以外,还会考虑其他的query的分数
tie_breaker的值,在0~1之间,是个小数,就ok
boost query
通过boost的值,影响最终算分
当 boost > 1时,打分的相关度会提升
当 boost < 0时,贡献分为负
当 0<boost<1, 打分权重相对较低
multi-index和multi-type搜索模式
example
Suggester
推荐词
suggestion mode
popular
always
missing
example
phrase suggestion
completion suggestion
自动补全
context suggester
自定义context
category
geo
实现context suggester的具体步骤
1. 定义以恶mapping
2. 索引数据,并且为每个文档加入context信息
3. 结合context进行suggestion查询
使用建议
精确度
completion > phrase > term
召回率
term > phrase > completion
性能
completion > phrase > term
地理信息查询
处理搜索结果
source filtering
搜索结果高亮
query highlight search
example
结果排序
针对text类型,无法排序的,需要打开正排索引,正排索引有两种实现方式:fileddata:doc values
field data
example
doc values
example
默认启动的
field data vs doc values
搜索结果分页
from/size
search after
examples
scroll api
如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scoll滚动查询,一批一批的查,直到所有数据都查询完处理完
使用scroll滚动搜索,可以先搜索一批数据,然后下次再搜索一批数据,以此类推,直到搜索出全部的数据来
使用scroll滚动搜索,可以先搜索一批数据,然后下次再搜索一批数据,以此类推,直到搜索出全部的数据来
(1)bool:must,must_not,should,组合多个过滤条件
(2)bool可以嵌套
(3)相当于SQL中的多个and条件:当你把搜索语法学好了以后,基本可以实现部分常用的sql语法对应的功能
(2)bool可以嵌套
(3)相当于SQL中的多个and条件:当你把搜索语法学好了以后,基本可以实现部分常用的sql语法对应的功能
原理是为数据生成快照,就算后面产生了其他相关数据也不会影响scroll数据查询
example
控制相关度
boosting
查询时权重提升
映射时权重提升
使用查询结构改变相关度
忽略 TF-IDF
function score query
field_value_factor
modifier
factor
max_boost
function_score
boost_mode
聚合查询
bucket aggregation
terms
data histogram
range
sampler
metric aggregation
avg/min / max / sum / stats
percentiles
pipeline aggregation
parent
sibling
matrix aggregation
matrix stats
作用范围与排序
跨集群搜索
Search Template
批量操作
批量查询
批量增删改
groovy脚本
ES,其实是有个内置的脚本支持的,可以基于groovy脚本实现各种各样的复杂操作。
example
0 条评论
下一页