当前位置: 首页 > 面试题库 >

Elasticsearch索引比它索引的日志的实际大小大得多吗?

和飞翔
2023-03-14
问题内容

我注意到,elasticsearch在晚上消耗了超过30GB的磁盘空间。相比之下,我要索引的所有日志的总大小仅为5 GB
…嗯,甚至不是,实际上更像是2.5-3GB。是否有任何原因,有没有办法重新配置它?我正在运行ELK堆栈。


问题答案:

有许多原因导致Elasticsearch内部的数据比源数据大得多。一般而言,Logstash和Lucene都在努力为数据 添加
结构,而这些数据原本是相对非结构化的。这会带来一些开销。

如果您使用的是3 GB的源,而索引数据为30 GB,则这是源数据的大约10倍。这很大,但不一定是闻所未闻的。如果在该度量中包括副本的大小,则30
GB可能是完全合理的。根据我自己的经验和直觉,我可能期望相对于源数据在3-5倍的范围内,这取决于数据的类型以及您在Elasticsearch中使用的存储和分析设置。

尝试精简Elasticsearch索引时,可以尝试以下四种不同的设置。

_source

Elasticsearch保留每个传入文档的原始原始JSON的副本。如果您想重建索引的原始内容,或在搜索结果中突出显示匹配项,则很有用,但它肯定会加起来。您可能要创建一个索引模板,该模板会禁用_source索引映射中的字段。

禁用该_source字段可能是磁盘使用情况的最大改进。

文档:Elasticsearch
_source字段

个别存储的字段

_source字段类似但独立于字段,您可以控制是否按字段存储字段的值。非常简单,并且在“映射”文档中针对核心类型多次提及。

如果您希望索引很小,则只应在搜索响应中存储需要返回的最小字段。与与主要数据存储相关联的文档ID一样,它可能少之又少。

文档:核心类型的Elasticsearch映射

_all

有时,您想查找与给定术语匹配的文档,而您实际上并不在乎该术语出现在哪个字段中。在这种情况下,Elasticsearch有一个特殊的_all字段,该字段将文档中所有字段中的所有术语推入其中。

这很方便,但是如果您的搜索完全针对特定字段,并且您没有尝试松散地匹配索引中任何地方的任何内容,那么您可以不用使用该_all字段了。

文档:Elasticsearch
_all字段

一般分析

这又回到了Lucene的主题,即向其他非结构化数据中添加结构。您要搜索的任何字段都需要进行分析。这是将一堆非结构化文本分解为 标记,
然后分析每个标记以对其进行规范化或将其扩展为多种形式的过程。这些标记被插入字典中,并且术语和它们所出现的文档(和字段)之间的映射也得以维护。

这一切都需要空间,对于某些领域,您可能并不希望对其进行分析。跳过分析还可以在索引时节省一些CPU时间。某些类型的分析确实可以使您的总条款膨胀,例如使用具有自由设置的n-
gram分析器将原始条款分解为许多较小的条款。

文档:分析和分析器简介

更多阅读

  • 彼得·金(Peter Kim)最近写了关于这个主题的文章:硬件规模调整或“我真正需要多少服务器?”


 类似资料:
  • 尝试打印包含 698 个项目的 ArrayList 时收到以下错误: 我使用了以下代码,我希望收到错误: 我的问题是,如果数组的大小是698,那么max索引不应该是697吗?我不明白为什么错误给出指数:698。

  • 问题内容: 我有一个简单的python脚本,用于索引包含一百万行的CSV文件: 这种方法效果很好,但是当我们进入成千上万的时候,它们的速度都呈指数下降。 我猜测如果我在较小的块中进行索引,ES的性能会更好。 有更有效的方法吗?sleep()会延迟帮助吗?还是有一种简单的方法可以通过编程将csv分成较小的块? 谢谢。 问题答案: 每运行N次 这里的例子

  • 正如标题所说,我的问题是,当我编译时,我在线程“main”java.lang.IndexOutOfBoundsException:Index:1,Size:1中得到了Exception。这是问题产生的部分。 编辑。 我一直在网上寻找解决方案,所以我很确定问题是数组太小,但我仍然不确定如何解决它。我试图让代码的上半部分只从数组中取出数字并将它们放入一个新的数组中。 这是我调用的其他方法。 我已经坚持

  • 问题内容: 我在同一台Ubuntu服务器上有一个Rails 3应用程序的暂存和生产实例(使用tyre gem)。看来这两个实例都共享相同的elasticsearch索引,这显然不是我想要的。 如何使生产和登台实例使用单独的实例? 问题答案: 您需要覆盖索引名称。假设您要绑定ActiveRecord,它将根据相关模型创建索引名称。您可以使用这样的前缀来调整名称; 然后会创建一个名为的索引,以此类推。

  • 这段代码是关于一个水罐车游荡在一个环境中寻找有任务的水站。 试图通过访问点的数组列表进行递增,但每次运行代码时,我都得到一个“indexoutofboundsexception”,但其索引不同,而且大小总是与索引相同,所以我非常困惑。中断程序的索引/大小看起来是随机变化的。 示例错误:线程“main”java.lang.IndexOutOfBoundsException:Index:5,SIZE:

  • 问题内容: 我正在寻找一种在Numpy中的线性索引和多维索引之间进行相互转换的快速方法。 为了使我的用法具体化,我收集了N个粒子,每个粒子都分配了5个浮点值(尺寸),给出了Nx5数组。然后,我使用numpy.digitize对每个维度进行分箱,并选择适当的分箱边界,以在5维空间中为每个粒子分配一个分箱。 然后,binassign包含与多维索引对应的行。然后,如果我想将多维索引转换为线性索引,我想我