elasticsearch权威指南 学习26

elasticsearch权威指南-- getting start 第八章 Sorting and Relevance(4)

Fielddata

在这章的最后一节,我们不会再讲解什么新技术了。而是来聊聊fielddata这个我们之前一再提到的概念,因为它有些内容还是需要我们了解的。

当我们对一个字段进行排序的时候,Elasticsearch需要找到每一个匹配查询的document字段的值。而反向索引虽然可以在查询的时候提供很好的性能,但是它的结构并不利于排序:

.当进行搜素时,我们需要将一个term与大量的document建立映射。

.当进行排序时,我们需要将一个document映射到它的term上,换句话说,我们需要反向倒置(uninvert)倒排索引。

为了提高排序性能,Elasticsearch会将你想排序那个字段的值全部加载到内存里,这就是我们说到的fielddata。

这里注意一下,Elasticsearch不是只将匹配的那个document里的field加载进内存,而是将index中所有的document里用于排序的那个字段值加载进内存,而且无论是不是同一个type的。

这里说一下Elasticsearch会将所有的value加载到内存的原因是从磁盘上uninverting一个索引是非常缓慢,尽管你的请求可能只需要极少的一些document,但你可能想在下一次请求时需要用到另外的一些document。所以一次将它全部加载进内存并保留它们是有意义的。

在Elasticsearch中Fielddata被用在以下几个地方:

对一个字段进行排序(field)

对一个字段进行聚合(Aggregation)

某些filter中(比如像geolocation filter)

Script that refer to field

当然很显然它会消耗很多内存,特别对于高密度的字符串字段,——有大量的不重复的值的字符串字段。比如像email的body。幸运的是内存不足这个问题可以由架构上的横向扩展来解决。比如多加一个节点。

现在我们已经知道什么是fielddata了。同样也知道它会使用大量的内存。在以后我们会讲解怎样查明fielddata正在使用的内存量,以及怎样限制它的内存使用量,以及怎样预加载fielddata去提高用户体验。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>