Elasticsearch含空格字段聚合(terms/cardinality)结果异常咨询
这个问题我太熟了!根源在于你的smartaccountname字段大概率用了Elasticsearch默认的text类型+standard分词器——这种组合会自动把带空格的字符串拆分成独立的词条,所以聚合的时候系统会把"FIRE"和"DEVICES"当成两个不同的项来统计,自然就得不到你想要的结果。
场景1:还没创建索引/可以重新构建索引
直接把smartaccountname字段定义为keyword类型,它不会对字符串做任何分词处理,会完整保留原始值,完美适配聚合需求。创建索引的mapping示例如下:
PUT /your_index_name { "mappings": { "properties": { "smartaccountname": { "type": "keyword" } } } }
之后再导入数据,不管是cardinality还是terms聚合,都会把"FIRE DEVICES"当成一个整体来统计。
场景2:已经有数据,不想重新索引
这种情况下可以给现有字段添加一个keyword子字段,不需要重新导入数据,只需要更新mapping:
PUT /your_index_name/_mapping { "properties": { "smartaccountname": { "type": "text", // 保留原text类型用于全文搜索(如果需要的话) "fields": { "keyword": { "type": "keyword", "ignore_above": 256 // 根据你的字段实际长度调整,超过这个长度的内容会被忽略 } } } } }
更新完mapping后,记得要重新索引现有数据(手动触发更稳妥),之后聚合时指定smartaccountname.keyword作为字段即可:
比如cardinality聚合:
POST /your_index_name/_search { "size": 0, "aggs": { "unique_account_count": { "cardinality": { "field": "smartaccountname.keyword" } } } }
terms聚合:
POST /your_index_name/_search { "size": 0, "aggs": { "account_name_counts": { "terms": { "field": "smartaccountname.keyword" } } } }
这样就能得到你预期的"FIRE DEVICES": 2的结果了。
内容的提问来源于stack exchange,提问作者SRIRAM RAMACHANDRAN
相关产品推荐
相关产品推荐

