150GB。
在ES中,索引是一组文档的集合,由于ES是个分布式的搜索引擎,索引会被分解成不同部分,索引大小为150GB。
Java指编程语言,Java具有大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境,使用Java编写的应用程序,既可以在一台单独的电脑上运行,也可以被分布在一个网络的服务器端和客户端运行。
filesystem类似于我们在mysql上建立一层redis缓存;
es的搜索引擎严重依赖于底层的filesystem cache,如果给filesystem cache更多的内存,尽量让内存可以容纳所有的indx segment file索引数据文件,那么你搜索的时候就基本都是走内存的,性能会非常高。
两者差距非常大,走磁盘和走systenfile cache的读取的性能差距可以说是秒级和毫秒级的差距了;
要让es性能要好,最佳的情况下,就是我们的机器的内存,至少可以容纳你的数据量的一半
最佳的情况下,是仅仅在es中就存少量的数据,存储要用来搜索的那些索引,内存留给filesystem cache的,如果就100G,那么你就控制数据量在100gb以内,相当于是,你的数据几乎全部走内存来搜索,性能非常之高,一般可以在1秒以内
的少数几个字段就可以了,比如说,就写入es id name age三个字段就可以了,然后你可以把其他的字段数据存在mysql里面,我们一般是建议用 es + hbase 的一个架构。
hbase的特点是适用于海量数据的在线存储,就是对hbase可以写入海量数据,不要做复杂的搜索,就是做很简单的一些根据id或者范围进行查询的这么一个 *** 作就可以了
如果确实内存不足,但是我们又存储了比较多的数据,比如只有30g给systemfile cache,但是存储了60g数据情况,这种情况可以做数据预热;
我们可以将一些高频访问的热点数据(比如微博知乎的热榜榜单数据,电商的热门商品(旗舰版手机,榜单商品信息)等等)提前预热,定期访问刷到我们es里;(比如定期访问一下当季苹果旗舰手机关键词,比如现在的iphone12)
对于那些你觉得比较热的,经常会有人访问的数据,最好做一个专门的缓存预热子系统,就是对热数据,每隔一段时间,提前访问一下,让数据进入filesystem cache里面去。这样下次别人访问的时候,一定性能会好一些。
我们可以将冷数据写入一个索引中,然后热数据写入另外一个索引中,这样可以确保热数据在被预热之后,尽量都让他们留在filesystem os cache里,别让冷数据给冲刷掉。
尽量做到设计document的时候就把需要数据结构都做好,这样搜索的数据写入的时候就完成。对于一些太复杂的 *** 作,比如join,nested,parent-child搜索都要尽量避免,性能都很差的。
es的分页是较坑的 ,为啥呢?举个例子吧,假如你每页是10条数据,你现在要查询第100页,实际上是会把 每个shard上存储的前1000条数据都查到 一个协调节点上,如果你有个5个shard,那么就有5000条数据,接着 协调节点对这5000条数据进行一些合并、处理,再获取到最终第100页的10条数据。
因为他是分布式的,你要查第100页的10条数据,你是不可能说从5个shard,每个shard就查2条数据?最后到协调节点合并成10条数据?这样肯定不行,因为我们从单个结点上拿的数据几乎不可能正好是所需的数据。我们必须得从每个shard都查1000条数据过来,然后根据你的需求进行排序、筛选等等 *** 作,最后再次分页,拿到里面第100页的数据。
你翻页的时候,翻的越深,每个shard返回的数据就越多,而且协调节点处理的时间越长。非常坑爹。所以用es做分页的时候,你会发现越翻到后面,就越是慢。
我们之前也是遇到过这个问题,用es作分页,前几页就几十毫秒,翻到10页之后,几十页的时候,基本上就要5~10秒才能查出来一页数据了
你系统不允许他翻那么深的页,或者产品同意翻的越深,性能就越差
如果是类似于微博中,下拉刷微博,刷出来一页一页的,可以用scroll api
scroll api1 scroll api2
scroll会一次性给你生成所有数据的一个快照,然后每次翻页就是通过游标移动 ,获取下一页下一页这样子,性能会比上面说的那种分页性能也高很多很多
scroll的原理实际上是保留一个数据快照,然后在一定时间内,你如果不断的滑动往后翻页的时候,类似于你现在在浏览微博,不断往下刷新翻页。那么就用scroll不断通过游标获取下一页数据,这个性能是很高的,比es实际翻页要好的多的多。
缺点:
如果您输入的ES查询语句正确但是没有返回值,可能存在以下几种原因:
1 数据库中不存在满足查询条件的文档:请检查您输入的查询条件是否正确,并确认数据库中是否存在满足查询条件的文档。您可以使用Kibana或其他ES管理工具进行数据检索,也可以手动查找数据存储位置,以确定是否存在符合条件的文档。
2 查询语句错误:虽然您认为查询语句正确,但仍有可能存在语法错误或逻辑错误等问题导致无法返回结果,请仔细检查查询语句,特别是查询条件和聚合条件等。
3 ES集群状态异常:如果ES集群出现了异常状态,如节点宕机、分片故障等情况,可能会导致查询请求无法正常处理,从而无法获取查询结果。请检查ES集群状态是否正常。
4 网络连接异常:如果网络连接不稳定或中断,也可能导致查询请求无法正常发送或接收,从而无法返回结果。请检查网络连接是否正常并重试查询 *** 作。
如果以上方法无法解决问题,请尝试通过更多调试方式(如日志分析、性能监控等)来排除问题,或联系相关技术支持人员寻求帮助。
以下是本次实战的环境信息,请确保您的Elasticsearch可以正常运行:
实战用的数据依然是一些汽车销售的记录,在 第一章 有详细的导入步骤,请参考 *** 作,导入后您的es中的数据如下图:
本篇实战的聚合 *** 作有以下内容:
接下来开始实战吧。
在上面的返回值中,第三个桶中没有文档,在有的业务场景中,我们不需要没有数据的桶,此时可以用min_doc_count参数来控制,如果min_doc_count等于2,表示桶中最少有两条记录才会出现在返回内容中,如下所示,min_doc_count如果等于1,那么空桶就不会被es返回了:
返回值如下所示,没有文档的桶不再出现:
注意:年、季度、月、周都的数量只能是1,其他粒度的数量可以是整数;
例如以90天作为区间来聚合,请求参数如下:
date_histogram也支持min_doc_count参数,和histogram桶的用法一样,对于下面的请求,es的响应中不会有空桶:
至此,区间聚合的学习和实战就完成了,到目前为止,我们的 *** 作用的都是索引中的全部数据,但是真是生产环境中,不会每次都用全部数据来做聚合,因此接下来的章节,会将聚合与查询、过滤等 *** 作结合在一起实战;
•对于只需要精确查询的字段,例如时间戳,应该设置为keyword。
•对需要进行全文检索的字段设置合理的分词器,不同的分词器查询效率相差较大。
合理地向Elasticsearch中进行数据索引时,也要注意以下几点:
返回结果中最重要的部分是 hits ,它包含 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档。
在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段。这意味着我们可以直接从返回的搜索结果中使用整个文档。这不像其他的搜索引擎,仅仅返回文档的ID,需要你单独去获取文档。
每个结果还有一个 _score ,它衡量了文档与查询的匹配程度。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。在这个例子中,我们没有指定任何查询,故所有的文档具有相同的相关性,因此对所有的结果而言 1 是中性的 _score 。
max_score 值是与查询所匹配文档的 _score 的最大值。
took 值告诉我们执行整个搜索请求耗费了多少毫秒。
_shards 部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。正常情况下我们不希望分片失败,但是分片失败是可能发生的。如果我们遭遇到一种灾难级别的故障,在这个故障中丢失了相同分片的原始数据和副本,那么对这个分片将没有可用副本来对搜索请求作出响应。假若这样,Elasticsearch 将报告这个分片是失败的,但是会继续返回剩余分片的结果。
timed_out 值告诉我们查询是否超时。默认情况下,搜索请求不会超时。如果低响应时间比完成结果更重要,你可以指定 timeout 为 10 或者 10ms(10毫秒),或者 1s(1秒):
在请求超时之前,Elasticsearch 将会返回已经成功从每个分片获取的结果。
应当注意的是 timeout 不是停止执行查询,它仅仅是告知正在协调的节点返回到目前为止收集的结果并且关闭连接。在后台,其他的分片可能仍在执行查询即使是结果已经被发送了。
使用超时是因为 SLA(服务等级协议)对你是很重要的,而不是因为想去中止长时间运行的查询。
以上就是关于java *** 作es获取索引存储大小全部的内容,包括:java *** 作es获取索引存储大小、ES大数据量下的查询优化、es查询语句正确,但是没有返回值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)