在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

doc_values对terms aggregation不起作用,对cardinality起作用,什么原因?

Elasticsearch | 作者 爱你一点点 | 发布于2016年04月25日 | 阅读数:5021

1、es2.3.1,所有字段不分词,且启用doc values
{
    "settings" : {
        "index" : {
            "number_of_shards" : 20,
            "number_of_replicas" : 1
        }
    },
    "mappings":
    {
        "_default_":
        {
          "dynamic_templates": [
          {
            "stringNotAnalyze": {
              "mapping": {
                "type": "string",
                "doc_values":true,
                "index":"not_analyzed",
                "store":false
              },
              "match_mapping_type": "string"
            }
          }
        ]
        }
    }
}
 
 
 
 
2、
terms :
{
  "aggs": {
    "计数": {
      "terms": {
        "field": "username"
      }
    }
  }
}
 
 

3、agg统计后,kopf下看到fielddata大小
"fielddata": { "memory_size": "376.9mb", "memory_size_in_bytes": 395229824, "evictions": 0 }
 
注:去重计数 doc values起作用,fielddata为空
{
  "aggs": {
    "去重计数": {
      "cardinality": {
        "field": "username"
      }
    }
  }
}
 
已邀请:

爱你一点点 - ELK,大数据安全,分布式扫描

赞同来自:

官方文档说es2.x不分词字段默认是采用doc values方式存储列值的,按道理对不分词字段聚合运算,fielddata的内存占用情况应该为零的才对,怎么会出现这种诡异的情况

medcl - 今晚打老虎。

赞同来自:

如果开启了docvalues,elasticsearch不会使用fielddata的,但是elasticsearch还是会在内存里面对string类型的字段 构建一个 global ordinals,这个是放在内存里面的,并且占用会在cat/fielddata里面体现,不过这个不是你说的「fielddata」,不过这个内存占用相比关闭docvalues启用的fielddata要小很多了

要回复问题请先登录注册