大家好,我用ElasticSearch5.6.3和对应的java api,在做聚合的时候,需要先对聚合字段做映射,也就是mapping。字段类型是string类型的,聚合的结果中,会把聚合字段分词。我想要的结果是聚合字段不分词。
TransportClient client=getClient();
PutMappingRequestBuilder putMapping = client.admin().indices().preparePutMapping("alert")
.setType("loginInfo");
putMapping.setUpdateAllTypes(true);
putMapping.setSource("{\"properties\":{\"Application_System\":{\"type\":\"string\",\"fielddata\":true}}}")
.get();
此时得到的分组结果是:
Application_System=务,MAX(Login_Time)=1.51153794E12,
Application_System=台,MAX(Login_Time)=1.51153794E12,
Application_System=商,MAX(Login_Time)=1.51153794E12,
Application_System=子,MAX(Login_Time)=1.51153794E12,
Application_System=平,MAX(Login_Time)=1.51153794E12,
Application_System=电,MAX(Login_Time)=1.51153794E12,
实际上,我需要的结果是一行数据:
Application_System=电子商务平台,MAX(Login_Time)=1.51153794E12,
查看官网的文档说明,说是添加index:not_analyzed可以让字段不分词,于是修改mapping映射如下:
putMapping.setSource("{\"properties\":{\"Application_System\":{\"type\":\"string\",\"fielddata\":true,\"index\":\"not_analyzed\"}}}")
.get();
运行会报错:
MapperParsingException[Mapping definition for [Application_System] has unsupported parameters: [fielddata : true]]
at org.elasticsearch.index.mapper.DocumentMapperParser.checkNoRemainingFields(DocumentMapperParser.java:151)
at org.elasticsearch.index.mapper.DocumentMapperParser.checkNoRemainingFields(DocumentMapperParser.java:145)
at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:285)
at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:199)
at org.elasticsearch.index.mapper.RootObjectMapper$TypeParser.parse(RootObjectMapper.java:102)
at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:111)
at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:91)
at org.elasticsearch.index.mapper.MapperService.parse(MapperService.java:644)
at org.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.applyRequest(MetaDataMappingService.java:264)
at org.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.execute(MetaDataMappingService.java:230)
at org.elasticsearch.cluster.service.ClusterService.executeTasks(ClusterService.java:634)
at org.elasticsearch.cluster.service.ClusterService.calculateTaskOutputs(ClusterService.java:612)
at org.elasticsearch.cluster.service.ClusterService.runTasks(ClusterService.java:571)
在此请教大家,想让聚合字段不分词,该如何处理?
我找到了一个不是很好的解决方案:
1、在新建索引的时候,先导入一行空数据(在没有数据的时候,不能做映射;在有数据的时候,数据类型已经默认指定了);
2、在导入正式数据的时候,指定字段的类型为keyword;
3、删除空行。
这样,在聚合的时候,这个聚合字段就不会被分词了。
这跟聚合没有关系,关键在于你的词库,你的词库里面有电子商务平台这个关键词吗?
@两江总督噶礼谢谢您的回复,词库里有“电子商务平台”,但是聚合字段,需要的是以整个字段的值来聚合,也就是要求聚合字段不能进行分词。ES5.X以后,之前的string类型被拆分为text和keyword,其中这个keyword类型就是用于聚合的。现在的问题是,我在导入数据的时候,无法指定一个字段的类型为keyword。
再次感谢 @两江总督噶礼,如果有这方面的经验,还请不吝赐教,这个问题已经困扰我几天了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。