开发者社区> 问答> 正文

ElasticSearch5.6.3中mapping字段的分词问题?报错

大家好,我用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)
	

在此请教大家,想让聚合字段不分词,该如何处理?

展开
收起
爱吃鱼的程序员 2020-06-07 22:22:51 722 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    我找到了一个不是很好的解决方案:

    1、在新建索引的时候,先导入一行空数据(在没有数据的时候,不能做映射;在有数据的时候,数据类型已经默认指定了);

    2、在导入正式数据的时候,指定字段的类型为keyword;

    3、删除空行。

    这样,在聚合的时候,这个聚合字段就不会被分词了。

    这跟聚合没有关系,关键在于你的词库,你的词库里面有电子商务平台这个关键词吗?

    @两江总督噶礼谢谢您的回复,词库里有“电子商务平台”,但是聚合字段,需要的是以整个字段的值来聚合,也就是要求聚合字段不能进行分词。ES5.X以后,之前的string类型被拆分为text和keyword,其中这个keyword类型就是用于聚合的。现在的问题是,我在导入数据的时候,无法指定一个字段的类型为keyword。

    再次感谢 @两江总督噶礼,如果有这方面的经验,还请不吝赐教,这个问题已经困扰我几天了。

     

    2020-06-07 22:23:06
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
阿里云Elasticsearch体系架构与特性解析 立即下载
开源与云:Elasticsearch应用剖析 立即下载
《Elasticsearch全观测解决方案》 立即下载