54.string field聚合以及fielddata原理初探

主要知识点:

  • 直接对分词的term进行聚合后果
  • 设置fielddata=true
  • 直接用.keyword进行聚合
  • doc value 的性能问题

一、直接对分词的term进行聚合后果

对于分词的field执行aggregation,发现报错。。。

1、新建一条数据(隐式创建一个索引和type)

POST /test_index/test_type/1

{

"test_field":"test"

}

2、进行聚合操作

GET /test_index/test_type/_search

{

"aggs": {

"group_by_test_field": {

"terms": {

"field": "test_field"

}

}

}

}

执行结果如下:

{

"error": {

"root_cause": [

{

"type": "illegal_argument_exception",

"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [test_field] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."

}

对分词的field直接执行聚合操作es会报错,错误信息中会说,必须要打开fielddata(fielddata=true),然后将正排索引数据加载到内存中,才可以对分词的field执行聚合操作,而且会消耗很大的内存

二、设置fielddata=true

1、给分词的field,设置fielddata=true

POST /test_index/_mapping/test_type

{

"properties": {

"test_field": {

"type": "text",

"fielddata": true

}

}

}

2、查看mapping

GET /test_index/_mapping/test_type

执行结果

{

"test_index": {

"mappings": {

"test_type": {

"properties": {

"test_field": {

"type": "text",

"fields": {

"keyword": {

"type": "keyword",

"ignore_above": 256

}

},

"fielddata": true

}

}

}

}

}

}

3、再次执行聚合操作

GET /test_index/test_type/_search

{

"size": 0,

"aggs": {

"group_by_test_field": {

"terms": {

"field": "test_field"

}

}

}

}

执行结果如下:

"aggregations": {

"group_by_test_field": {

"doc_count_error_upper_bound": 0,

"sum_other_doc_count": 0,

"buckets": [

{

"key": "test",

"doc_count": 2

}

]

}

}

}

可以看出如果要对分词的field执行聚合操作,必须将fielddata设置为true

三、直接用.keyword进行聚合

1、使用内置field不分词,对string field进行聚合。在es新版本中,新对text的字段新建一个.keyword的字段,可以直接用这个字段进行聚合操作

GET /test_index/test_type/_search

{

"size": 0,

"aggs": {

"group_by_test_field": {

"terms": {

"field": "test_field.keyword"

}

}

}

}

执行结果如下:

"aggregations": {

"group_by_test_field": {

"doc_count_error_upper_bound": 0,

"sum_other_doc_count": 0,

"buckets": [

{

"key": "test",

"doc_count": 2

}

]

}

}

}

可以看出此时就已经可以聚合。如果对不分词的field执行聚合操作,直接就可以执行,不需要设置fieldata=true

四、分词field+fielddata的工作原理

在es内部会对所有不分词的field建立doc value,这些不分词的field可以执行聚合操作,如果某一个field不分词,那么在新建index的时候就已经建立了doc value值,所以es针对不分词的field会自动使用doc value来执行聚合操作。

对于分词field,是没有doc value的,在新建索引时,如果某个field是分词的,那么es是不会给它建立doc value正排索引的,因为分词后,占用的空间过于大,所以默认是不支持分词field进行聚合。对于分词field,必须打开和使用fielddata,完全存在于纯内存中结构和doc value类似,如果是ngram或者是大量term,那么必将占用大量的内存,性能会变的很差。

如果一定要对分词的field执行聚合,那么必须将fielddata=true,然后es就会在执行聚合操作的时候,现场将field对应的数据,建立一份fielddata正排索引,fielddata正排索引的结构跟doc value是类似的,但是只会将fielddata正排索引加载到内存中来,然后基于内存中的fielddata正排索引执行分词field的聚合操作。这种方式会耗费大量的内存空间。

为什么fielddata必须在内存?因为分词的字符串,需要按照term进行聚合,需要执行更加复杂的算法和操作,如果基于磁盘和os cache,那么性能会很差。

原文地址:https://www.cnblogs.com/liuqianli/p/8542065.html

时间: 2024-10-08 14:59:07

54.string field聚合以及fielddata原理初探的相关文章

dumpsys工作原理初探

dumpsys用来dump某系统组件的信息: *./frameworks/av/native/cmds/dumpsys/dumpsys.cpp* ```     sp<IServiceManager> sm = defaultServiceManager(); //...     for (size_t i=0; i<N; i++) {         sp<IBinder> service = sm->checkService(services[i]);       

C#之CLR内存原理初探

C#之CLR内存原理初探 投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-08-04我要评论 这篇文章主要介绍了C#之CLR内存原理初探,有助于读者进一步理解C#的运行原理,需要的朋友可以参考下 本文初步讲述了C#的CLR内存原理.这里所关注的内存里面说没有寄存器的,所以我们关注的只有托管堆(heap),栈(stack), 字符串常量池(其中string是一个很特殊的对象) 首先我们看两个方法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 vo

Python源码剖析笔记3-Python执行原理初探

Python源码剖析笔记3-Python执行原理初探 本文简书地址:http://www.jianshu.com/p/03af86845c95 之前写了几篇源码剖析笔记,然而慢慢觉得没有从一个宏观的角度理解python执行原理的话,从底向上分析未免太容易让人疑惑,不如先从宏观上对python执行原理有了一个基本了解,再慢慢探究细节,这样也许会好很多.这也是最近这么久没有更新了笔记了,一直在看源码剖析书籍和源码,希望能够从一个宏观层面理清python执行原理.人说读书从薄读厚,再从厚读薄方是理解了

String的&#39;+&#39;的性能及原理

逛了几个论坛.不少人在讨论String的"+",StringBuilder与StringBuffer等一系列的问题,先不多说了了 现分类详述: 1.String的'+',底层执行,及效率问题 2.StringBilder与StringBuffer的比较 本篇博文先介绍第一个问题 为了让大家看明白, 我们举例说明吧! 为了加深理解,我们可以来做几个小实验. javac Test         编译文件 javap -c Test   查看虚拟机指令 实验一:纯字符串 public cl

mongodb 更新数组出现can&#39;t append to array using string field name

数据库内容大概如下: { _id:1, "hero_list" : { "15521" : { "stars" : 0, "_id" : 15521, "equip" : [ [ ], [ ], [ ], { "item_id" : 310141, "lv" : 103, "uuid" : "4a727ee1-e7b0-4265-b004

远程调用原理初探(附c#代码示例)

分布式系统有很多成熟的解决方案.如:微软的WCF.WCF太过于复杂,配置也麻烦.其实可以自己动手设计一个小的分布式系统.系统的原理完全在自己掌握之中,可以根据业务随机而变.这里展示远程调用最核心最基本的处理逻辑,其实远程调用并不复杂神秘. 分布式系统其实是数据流的交换.数据必须快速的从一段传送到另一端,否则系统性能就大打折扣.对于.net,本人设计一个非常优化易于使用的网络库(EasyNetMessage).使用该库,不需要关心底层细节,所有处理对象是string.byte:发送时,不需要处理分

SHA-256算法和区块链原理初探

组内技术分享的内容,目前网上相关资料很多,但读起来都不太合自己的习惯,于是自己整理并编写一篇简洁并便于(自己)理解和分享的文章. 因为之前对密码学没有专门研究,自己的体会或理解会特别标注为"个人理解",请注意甄别,如有必要可以自行查证. 阅读前需要树立一种观点:大部分场景都是基于概率的大小而言的,比如SHA256安全性.区块链不可更改性等. SHA-256算法 简介 区块链的基础算法之一,在其中用于区块hash计算方法. 是SHA-2下的一个算法标准,而SHA-2全称安全散列算法2,即

【Java基本功】一文读懂String及其包装类的实现原理

String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. String的连接 @Testpublic void contact () { //1连接方式 String s1 = "a"; String s2 = "a"; String s3 = "a" + s2; String s4 = "a&qu

Spark job server原理初探

Spark job server是一个基于Spark的服务系统,提供了管理SparkJob,context,jar的RestFul接口. 专注标注原文链接 http://www.cnblogs.com/shenh062326/p/6193375.html 使用说明 参考 http://debugo.com/spark-jobserver/ 原理介绍 服务端JobServer首先启动,它会启动一个名叫WebApi的HttpService服务,它提供下面这几个Routes val myRoutes