开封网站推广公司,网站建设学习课程,美图秀秀可以做网站吗,wordpress 仿站思路文章目录 1、什么是ElasticSearch;2、ElasticSearch的基本概念#xff1b;3、什么是倒排索引#xff1b;4、DocValue的作用#xff1b;5、text和keyword类型的区别#xff1b;7、query和filter的区别#xff1b;8、es写数据的过程#xff1b;9、es的更新和删除流程#… 文章目录 1、什么是ElasticSearch;2、ElasticSearch的基本概念3、什么是倒排索引4、DocValue的作用5、text和keyword类型的区别7、query和filter的区别8、es写数据的过程9、es的更新和删除流程10、es的搜索流程11、es在高并发下如何保证读写一致性12、es如何选举master节点13、es的分布式原理14、es是如何避免脑裂现象15、建立索引阶段性能提升方法16、es的深度分页与滚动搜索scroll; 1、什么是ElasticSearch;
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎基于RESTful web接口。Elasticsearch是用Java语言开发的并作为Apache许可条款下的开放源码发布是一种流行的企业级搜索引擎。
2、ElasticSearch的基本概念
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎基于RESTful web接口数据的格式使用Json。 1、Index索引 ES将数据存储于一个或多个索引中索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说索引相当于SQL中的一个数据库或者一个数据存储方案(schema)。索引由其名称必须为全小写字符进行标识并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。 2、Type类型 类型是索引内部的逻辑分区(category/partition)然而其意义完全取决于用户需求。因此一个索引内部可定义一个或多个类型(type)。一般来说类型就是为那些拥有相同的域的文档做的预定义。例如在索引中可以定义一个用于存储用户数据的类型一个存储日志数据的类型以及一个存储评论数据的类型。类比传统的关系型数据库领域来说类型相当于“表”。Elastic 6.x 版只允许每个 Index 包含一个 Type7.x 版将会彻底移除 Type 3、Document文档 文档是Lucene索引和搜索的原子单位它是包含了一个或多个域的容器基于JSON格式进行表示。文档由一个或多个域组成每个域拥有一个名字及一个或多个值有多个值的域通常称为“多值域”。每个文档可以存储不同的域集但同一类型下的文档至少应该有某种程度上的相似之处 。Index中的单条记录就称为Document多个Document构成一个index。 4、Node节点 运行了单个实例的ES主机称为节点它是集群的一个成员可以存储数据、参与集群索引及搜索操作。类似于集群节点靠其名称进行标识默认为启动时自动生成的随机Marvel字符名称。用户可以按需要自定义任何希望使用的名称但出于管理的目的此名称应该尽可能有较好的识别性。节点通过为其配置的ES集群名称确定其所要加入的集群。 5、Cluster集群 一个集群是由一个或多个节点(服务器)组成的通过所有的节点一起保存你的全部数据并且提供联合索引和搜索功能的节点集合。每个集群有一个唯一的名称标识默认是“elasticsearch”。这个名称非常重要因为一个节点(Node)只有设置了这个名称才能加入集群成为集群的一部分。 6、Shards分片 我们在一个索引里存储的数据潜在的情况下可能会超过单节点硬件的存储限制。例如单个索引有上千万个文档需要占用1TB的硬盘存储空间但是一台机器的硬盘可能没有这么大或者是即便有这么大但是单个节点在提供搜索服务时会响应缓慢。解决这个问题Elasticsearch提供了分片的能力它可以将你的索引细分成多个部分。当你创建一个索引的时候你可以简单的定义你想要的分片的数量。每个分片本身是一个全功能的完全独立的“索引”它可以部署在集群中的任何节点上。 创建索引时用户可指定其分片的数量默认数量为5个。 1它允许你水平切分你的内容卷 2它允许你通过分片来分布和并行化执行操作来应对日益增长的执行量 Shard有两种类型primary和replica即主shard及副本shard。Primary shard用于文档存储每个新的索引会自动创建5个Primary schemahard当然此数量可在索引创建之前通过配置自行定义不过一旦创建完成其Primary shard的数量将不可更改。Replica shard是Primary Shard的副本用于冗余数据及提高搜索性能。每个Primary shard默认配置了一个Replica shard但也可以配置多个且其数量可动态更改。ES会根据需要自动增加或减少这些Replica shard的数量。ES集群可由多个节点组成各Shard分布式地存储于这些节点上。 7、Replicas复制 在一个网络环境下或者是云环境下故障可能会随时发生有一个故障恢复机制是非常有用并且是高度推荐的以防一个分片或节点不明原因下线或者因为一些原因去除没有了。为了达到这个目的Elasticsearch允许你制作分片的一个或多个拷贝放入一个叫做复制分片或短暂复制品中。 1高可用。它提供了高可用来以防分片或节点宕机。为此一个非常重要的注意点是绝对不要将一个分片的拷贝放在跟这个分片相同的机器上。 2高并发。它允许你地分片可以提供超出自身吞吐量的搜索服务搜索行为可以在分片所有的拷贝中并行执行。 每个索引可以被切分成多个分片一个索引可以被复制零次就是没有复制或多次。一旦被复制每个索引将会有一些主分片就是那些最原始不是被复制出来的分片还有一些复制分片就是那些通过复制主分片得到的分片。主分片和复制分片的数量可以在索引被创建时指定。索引被创建后你可以随时动态修改复制分片的数量但是不能修改主分片的数量。 8、Mapping映射 ES中所有的文档在存储之前都要首先进行分析。用户可根据需要定义如何将文本分割成token、哪些token应该被过滤掉以及哪些文本需要进行额外处理等等。另外ES还提供了额外功能例如将域中的内容按需排序。事实上ES也能自动根据其值确定域的类型。
3、什么是倒排索引
倒排表以字或词为关键字进行索引表中关键字所对应的记录表项记录了出现这个字或词的所有文档一个表项就是一个字表段它记录该文档的ID和字符在该文档中出现的位置情况。
4、DocValue的作用
倒排索引也是有缺陷的假如我们需要对数据做一些聚合操作比如排序/分组时lucene内部会遍历提取所有出现在文档集合的排序字段然后再次构建一个最终的排好序的文档集合list这个步骤的过程全部维持在内存中操作而且如果排序数据量巨大的话非常容易就造成solr内存溢出和性能缓慢。 DocValues 就是 es 在构建倒排索引的同时构建了正排索引保存了docId到各个字段值的映射可以看作是以文档为维度从而实现根据指定字段进行排序和聚合的功能。 另外doc Values 保存在操作系统的磁盘中当docValues大于节点的可用内存ES可以从操作系统页缓存中加载或弹出从而避免发生内存溢出的异常docValues远小于节点的可用内存操作系统自然将所有Doc Values存于内存中堆外内存有助于快速访问。
5、text和keyword类型的区别
text类型文本类型会使用默认分词器分词也就是存入的数据会先进行分词然后将分完词的词组存入索引当然你也可以为他指定特定的分词器。 text类型检索不是直接给出是否匹配而是检索出相似度并按照相似度由高到低返回结果。这样会导致本来我们认为应该查询出来的数据有可能会查询不到。 如果定义成keyword类型关键字类型那么默认就不会对其进行分词原样存储。当一个字段需要按照精确值进行过滤、排序、聚合等操作时, 就应该使用keyword类型. keyword类型检索直接被存储为了二进制检索时我们直接匹配不匹配就返回false。所以精确匹配可以用keyword。 6、什么是停顿词过滤
7、query和filter的区别
filter的查询注重结果也就是目标与查询条件是否匹配而query的查询注重过程也就是目标与查询条件的匹配度匹配度越高的优先输出 1、因此filter的查询是没有评分的而query的查询是有评分的 2、filter有相应的缓存机制可以提高查询效率并且因为filter不计算相关性评分所以查询速度更快
8、es写数据的过程
1ES 客户端选择一个节点 node 发送请求过去这个节点就是协调节点 coordinating node
2协调节点对 document 进行路由通过 hash 算法计算出数据应该落在哪个分片 shard 上然后根据节点上维护的 shard 信息将请求转发到对应的实际处理节点node上
shard hash(document_id) % (num_of_primary_shards)
3实际的节点上的 primary shard 主分片处理请求然后将数据同步到副本节点 replica node
4coordinating node 等到 primary node 和所有 replica node 都执行成功之后就返回响应结果给客户端。9、es的更新和删除流程
1如果是删除操作文档其实并没有真的被删除而是在 .del 文件中被标记为 deleted 状态。该文档依然能匹配查询但是会在结果中被过滤掉。
2如果是更新操作就是将旧的 doc 标识为 deleted 状态然后创建一个新的 doc。memory buffer 每 refresh 一次就会产生一个 segment 文件 所以默认情况下是 1s 生成一个 segment 文件这样下来 segment 文件会越来越多此时会定期执行 merge。每次 merge 的时候会将多个 segment 文件合并成一个同时这里会将标识为 deleted 的 doc 给物理删除掉不写入到新的 segment 中然后将新的 segment 文件写入磁盘这里会写一个 commit point 标识所有新的 segment 文件然后打开 segment 文件供搜索使用同时删除旧的 segment 文件10、es的搜索流程
1、query阶段1. node1在这6个主副分片中随机选择3个分片,发送search request;2. 被选中的3个分片会分别执行查询并排序,返回fromsize个文档id和排序值;3. node1整合3个分片返回的from size个文档id,根据排序值排序后选取from到fromsize的文档id;
2、fetch阶段1. node1向相关的分片发送multi_get请求;2. 3个分片返回文档详细数据3. node1拼接返回的结果并返回给客户11、es在高并发下如何保证读写一致性
1对于更新操作可以通过版本号使用乐观并发控制以确保新版本不会被旧版本覆盖
每个文档都有一个_version 版本号这个版本号在文档被改变时加一。Elasticsearch使用这个 _version 保证所有修改都被正确排序。当一个旧版本出现在新版本之后它会被简单的忽略。
利用_version的这一优点确保数据不会因为修改冲突而丢失。比如指定文档的version来做更改。如果那个版本号不是现在的我们的请求就失败了。
2对于写操作一致性级别支持 quorum/one/all
默认为 quorum即只有当大多数分片可用时才允许写操作。但即使大多数可用也可能存在因为网络等原因导致写入副本失败这样该副本被认为故障分片将会在一个不同的节点上重建。
one要求我们这个写操作只要有一个primary shard是active活跃可用的就可以执行
all要求我们这个写操作必须所有的primary shard和replica shard都是活跃的才可以执行这个写操作
quorum默认的值要求所有的shard中必须是大部分的shard都是活跃的可用的才可以执行这个写操作
3对于读操作可以设置 replication 为 sync(默认)这使得操作在主分片和副本分片都完成后才会返回如果设置replication 为 async 时
也可以通过设置搜索请求参数_preference 为 primary 来查询主分片确保文档是最新版本。12、es如何选举master节点
Elasticsearch 的选主是 ZenDiscovery 模块负责的主要包含Ping节点之间通过这个RPC来发现彼此和 Unicast单播模块包含一个主机列表以控制哪些节点需要ping通这两部分
确认候选主节点的最少投票通过数量elasticsearch.yml 设置的值 discovery.zen.minimum_master_nodes;
对所有候选 master 的节点node.master: true根据 nodeId 字典排序每次选举每个节点都把自己所知道节点排一次序然后选出第一个第0位节点暂且认为它是master节点。
如果对某个节点的投票数达到阈值并且该节点自己也选举自己那这个节点就是master。否则重新选举一直到满足上述条件。13、es的分布式原理
Elasticsearch 会对存储的数据进行切分将数据划分到不同的分片上同时每一个分片会保存多个副本主要是为了保证分布式环境的高可用。在 Elasticsearch 中节点是对等的节点间会选取集群的 Master由 Master 会负责集群状态信息的改变并同步给其他节点。
Elasticsearch 的性能会不会很低只有建立索引和类型需要经过 Master数据的写入有一个简单的 Routing 规则可以路由到集群中的任意节点所以数据写入压力是分散在整个集群的。14、es是如何避免脑裂现象
1当集群中 master 候选节点数量不小于3个时node.master: true可以通过设置最少投票通过数量discovery.zen.minimum_master_nodes设置超过所有候选节点一半以上来解决脑裂问题即设置为 (N/2)1
2当集群 master 候选节点 只有两个时这种情况是不合理的最好把另外一个node.master改成false。如果我们不改节点设置还是套上面的(N/2)1公式此时discovery.zen.minimum_master_nodes应该设置为2。这就出现一个问题两个master备选节点只要有一个挂就选不出master了15、建立索引阶段性能提升方法
1使用 SSD 存储介质
2使用批量请求并调整其大小每次批量数据 5–15 MB 大是个不错的起始点。
3如果你在做大批量导入考虑通过设置 index.number_of_replicas: 0 关闭副本
4如果你的搜索结果不需要近实时的准确度考虑把每个索引的 index.refresh_interval 改到30s
5段和合并Elasticsearch 默认值是 20 MB/s。但如果用的是 SSD可以考虑提高到 100–200 MB/s。如果你在做批量导入完全不在意搜索你可以彻底关掉合并限流。
6增加 index.translog.flush_threshold_size 设置从默认的 512 MB 到更大一些的值比如 1 GB16、es的深度分页与滚动搜索scroll;
一种快照的查询形式快照一旦形成本次滚动查询内便无法查出来新增的那些数据而且scroll是无法进行排序的也无法指定from那么我们想查看指定页码的数据就必须将该页数据之前的全部数据取出来再进行丢弃所以scroll一般用于导出全量数据。
数据量小的情况使用最方便灵活性好实现简单
一种快照的查询形式快照一旦形成本次滚动查询内便无法查出来新增的那些数据而且scroll是无法进行排序的也无法指定from那么我们想查看指定页码的数据就必须将该页数据之前的全部数据取出来再进行丢弃所以scroll一般用于导出全量数据。
导出全量数据时性能最好