![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
elasticsearch
lixia0417mul2
避免成为那些从来没有接触过真正技术的所谓技术生涯
展开
-
日志存储 elasticsearch vs clickhouse
elasticsearch优点:a. 查询速度快,es是基于lucene的倒排索引实现,数据分词后预先已经排好序了,所以查询速度很快,qps较高,并且cpu消耗不大b.es的索引字段比较灵活,可以随意的增加新字段到es中elasticsearch缺点:a.数据写入时要对所有的字段进行分词操作,然后在对这些分词构建倒排索引,事实上,并不是所有的分词都会在搜索中用到,这里类似于数据预聚合的概念,有些分词是没必要的b.es的倒排索引文件,正排文件,docvalue文件等都很大,压缩效果很小,这就造成了数原创 2022-04-23 12:16:05 · 2865 阅读 · 0 评论 -
es的分片数量和扩展性分析
es的索引的分片一旦设定就不能修改了。所以规划容量是可以有以下两个思路:1.首先设置一个比较大的分片数量,由于每个分片对应一个lucene索引,大的分片数量会导致较多的文件描述符,也会导致搜索性能受影响,因为查询需要在所有分片上面执行才能获取到最终结果。备注: 一个lucene索引的文档数一般来说是有限的,一般就是21亿个文档数。2.使用多个索引+别名的方式设置,我们可以每个索引还设置较小的分片数,然后通过新建多个索引的方式容纳海量数据,搜索的时候通过别名来映射这些索引的集合....原创 2021-10-24 12:54:30 · 1709 阅读 · 0 评论 -
es分片及source字段小结
1.es的索引包含很多分片,每个分片对应一个lucene索引,每个lucene索引包含多个分段,每个分段包含部分文档的子集2.lucene的倒排索引结构的逻辑视图: 词条–>文档id–>文档中对应词条的位置3.es的lucene中source和字段的store的关系,如果字段的store为true,那么当查询指定field为某个字段时,优先获取这个store字段的值,否则会去解析source字段的值.正常情况下,除非source字段很大,解析消耗很多,否则通过存储source字段即可达到目的原创 2021-10-18 01:55:26 · 456 阅读 · 0 评论 -
es支持的操作及性能
es是基于lucene的分布式Nosql存储系统,由于lucene是支持文档的新增,修改,删除操作的,所以es也是支持增删查改操作的,只是说当修改或删除操作发生的时候,磁盘上的被删除文档还存在,还继续占用磁盘空间,直到发生段合并操作才会回收被删除文档的空间. lucene的更新操作是一个先删后新增的过程....原创 2021-10-16 21:11:06 · 683 阅读 · 0 评论 -
es的doc_value对排序字段的作用
es普通情况下的查询类型是query_then_fetch,query阶段是把所有满足条件的文档id和对应的排序字段的值读取到汇总节点,按照排序字段的值排序后取前N的文档id再进行下一步的fetch阶段,所以各个分片如何快速的返回文档id和排序字段值就至关重要,而doc_value字段的作用即在于此,他可以根据文档id快速得到对应字段的值....原创 2021-10-15 02:14:31 · 250 阅读 · 0 评论 -
es的近实时搜索
es的近实时搜索其实底层是通过lucene的近实时搜索实现的,1.对于lucene来说,有两个主要的类: IndexWriter类和IndexReader类,正常情况下,IndexReader只能读取到创建时刻的索引的快照数据,当通过IndexWriter写入文档并进行commmit操作后,为了能看到这些新加入的文档,需要重新打开一个新的IndexReader才可以。2.es的刷新操作其实对应的是创建新的IndexReader的频率,这样新打开的IndexReader就能看到最新的提交的索引数据。3.原创 2021-10-15 02:07:58 · 379 阅读 · 0 评论 -
kafka分区和es的分区支持对比
1.kafka很容易的通过管理工具增加新的分区,这种方式只会对指定了key的消息产生影响,但是这种影响其实不大,因为消费者其实还是能消费到全部的消息2.相比较之下es不支持增加分区,原因在于es的查询流程中:query phase–fetch phase,fetch phase的情况下是根据id去获取文档的,如果此时分区数变化了,那么就会有很多id获取不到文档数据,而其实这个文档数据是存在于es的另外的分片中的,所以es并不支持在线增加分区...原创 2021-08-19 02:16:17 · 1188 阅读 · 0 评论 -
es中对标mysql group by的teams聚合类型
1.假设对应的索引的数据如下:{“name”: “张三”,“interest”:[“篮球,足球”]}{“name”: “李四”,“interest”:[“钓鱼,足球”]}2.假设我们想知道每个爱好的人数,那我们的查询可以这样写:GET /_search{ "size" : 0, "aggs" : { "actors" : { "terms" : { "field" : "interest",原创 2020-09-06 01:24:30 · 323 阅读 · 0 评论 -
es高性能注意事项
1.es是一个极度依赖操作系统文件缓存的系统,读取磁盘上的文件和读取操作系统文件缓存中的操作的时间复杂度完全是两个不同的数量级(毫秒和秒的差距),所以运行es的物理机要保留尽可能多的物理内存给操作系统的文件缓存使用,当然如果实在数据太大,操作系统完全不可能缓存这些所有的索引文件的时候,最好把热点的索引数据在后台进行一个查询操作,这样可以定时把磁盘上的该文件加载到操作系统的文件缓存中,这样用户进行查询操作的时候延时就很低了2.由于一般索引文件的大小要远远大于物理机上的可用物理内存,所以最好可以把索引按照热索原创 2020-08-27 00:47:15 · 258 阅读 · 0 评论 -
es中的search_type简单理解
es中只要用到了两种search_type,一种是query_then_fetch(默认),另一种是dfs_query_then_fetch,我们知道计算某个文档的得分时主要使用的是tf/idf公式,这就涉及到一个问题:计算文档得分的时候是使用对应分片上的tf/idf数值,还是某个索引上所有分片的全局的tf/idf数值?显然后者得分的计算更加精确,但是性能更差,因为多了一个检索各个分片的tf和idf的操作,这也就是这两种搜索类型的区别。前者虽然精确度不够,但是更快,而且从统计学角度,如果数据分布均匀的话,原创 2020-08-19 23:42:30 · 1581 阅读 · 0 评论 -
es的查询逻辑
1.es的query分为三个阶段: 分散查询-聚和查询-最终结果返回a)分散查询阶段: 假设收到请求的节点为A节点,A节点会把查询请求分发到构成要查询的索引的每个分片所在的节点上(假设是B,C,D三个节点),B,C,D三个节点会把满足查询条件的document的Id和对应的score返回给A节点b)聚合查询阶段:A节点会把B,C,D节点返回的文档列表按照分数进行排序,取满足topN的文档,然后把这些文档Id发给对应保护这些文档Id的节点,比如B和D,此时B和D会返回具体的文档内容给Ac)最终结果返回:原创 2020-08-15 00:35:21 · 675 阅读 · 0 评论 -
es的master选举摘要
1.es的master选举采用的是自己实现的类似raft算法的方式,而不是采用zk去实现,他的master选举的依据有两点:第一点比较clusterstate的version版本,谁的版本高谁就是master,第二点:clusterstate的version版本一样的情况下,比较节点的id,谁的id比较小,谁就是master,这里的id比较小应该是有这个节点先启动的愿望在里面2.在每一轮投票中,每个节点只投一票并汇总受到的选择本节点为master的选票,只要选择本节点为master节点的选票超过半数,那么原创 2020-08-09 12:18:28 · 353 阅读 · 0 评论 -
es的写入一致性
1.es的写入时的consistency参数的含义其实指的写入document的时候需要多少个shard处于活跃状态,活跃状态的意思是shard能ping得通,这里是不保证写入操作在这么多的shard都写入成功之后才返回的,只是说既然一开始是活跃的,那么成功的几率很大2.在进行了第一步的判断之后,es会把这个写入的数据发送给其他的所有副本,并等待所有副本的响应结果,这里可能成功也可能失败,这个信息会放到_shard中返回给客户端3.只有第二步结束后才把写入结果返回给client客户端.----注意:在原创 2020-08-06 01:34:16 · 465 阅读 · 0 评论 -
es的node内存设置
es是一个消耗非常多内存的应用,要使用到大量的文件缓存,所以物理机的可用于作为文件缓存的内存数量必须足够,否则es的性能将受到极大的影响,所以对一台运行es的物理机来说,分配给jvm的内存数据一般在总物理机总内存的50%左右即可,剩下50%的内存单纯就留给操作系统用来做文件缓存用...原创 2020-08-02 21:24:22 · 266 阅读 · 0 评论 -
es中的高效文件读取方式
es读取磁盘数据的时候原创 2020-07-29 00:50:41 · 717 阅读 · 1 评论 -
es中主分片和副本分片
我们知道es中保存数据的时候是有主分片和副本分片的,那么副本分片的作用有哪些呢?1.作为备份,防止主分片崩溃2.分担查询请求,请求会在主分片和副本分片之间均匀分布说道第二点,那我们来回答这样一个疑问:两个连续的es查询请求拿到的结果有可能不一样吗?答案是可能,因为主分片的数据和副本分片的数据不一定是完全一致的,类似数据库的主从一样,从库不一定和主库的数据是完全一致的...原创 2020-07-25 12:00:53 · 4293 阅读 · 3 评论 -
ES中节点的角色
1.master候选人角色 : 作用就是管理集群的状态信息2.data数据节点角色 : 保存集群的索引数据3.client协调者角色: 类似网关的角色,接收到客户端的请求后进行请求分发及响应聚合es集群中的节点可以身居多个角色,比如可以同时是master和data角色.选举算法:es中的选举算法类似于zookeeper中的选举算法,简单描述就是选举stateversion比较高的节点,如果大家都一样,那就选举节点id比较小的节点作为master。事实上,为何es不直接使用zk的来进行master选原创 2020-07-20 02:04:45 · 1076 阅读 · 0 评论 -
es的聚合数据的准确性
1.我们在使用es做数据聚合时,需要注意的是我们得到的聚合结果是个近似的结果而不是精确的结果,我这里指的是一个索引有多个分片的情形下:主要原因是由于es在进行聚合操作获取TopN的记录时,通过请求每个分片的TopN条记录,总共获取到分片数 * TOPN的记录,然后从分片数 * TopN的记录中在获取TopN条记录,这样就不可避免地遗漏数据,导致数据不准确,当然我们可以指定从每个分片获取的记录条数,减少这种不准确度,不过这样会导致响应时间会相应变长,这需要开发的过程中做好权衡....原创 2020-07-15 00:56:10 · 771 阅读 · 0 评论 -
es搜索准实时的理解
欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图片原创 2020-06-25 11:19:42 · 295 阅读 · 0 评论 -
es中的项向量理解
关于项向量的理解比较好的一篇文章:https://blog.csdn.net/wangzhengnb/article/details/7782549通俗理解就是: 由于倒排索引只能查找到文档的级别,要想查找文档中某个域的某个词项所在的位置信息,需要要么暴力搜索,要么建立项向量的数据结构额外存储。这个额外的存储结构对应到lucene的.tvx,.tvd,.tvf这三个文件。粗略理解这三个文件的作用: 总体上说,这三个文件是为了方便从文档Id到某个词项出现位置的搜索,目的是为了高亮显示的时候节约性能,是一个原创 2020-06-26 12:42:14 · 503 阅读 · 0 评论