ES:Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes
发生缘由
-
学习ES中Java HighLevel Rest Client客户端API
运行环境
-
elasticsearch版本:7.12.1
-
jdk版本:jdk-8
-
电脑系统:win10
-
Idea版本:2021.2
报错信息
org.elasticsearch.common.compress.NotXContentException: Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes
at org.elasticsearch.common.compress.CompressorFactory.compressor(CompressorFactory.java:42)
at org.elasticsearch.common.xcontent.XContentHelper.convertToMap(XContentHelper.java:108)
at org.elasticsearch.client.indices.CreateIndexRequest.source(CreateIndexRequest.java:276)
at org.elasticsearch.client.indices.CreateIndexRequest.source(CreateIndexRequest.java:257)
at com.linxuan.hotel.HotelDemoApplicationTests.createHotelIndex(HotelDemoApplicationTests.java:33)
at java.util.ArrayList.forEach(ArrayList.java:1249)
at java.util.ArrayList.forEach(ArrayList.java:1249)
分析排查
-
Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes
-
压缩器检测只能在某些 xcontent 字节或压缩的 xcontent 字节上面调用
根据报错原因可以将错误定位至HotelDemoApplicationTests.java:33
行,代码如下:
那么就可以将报错信息转为人话了:语句的类型不是JSON风格的或者JSON格式化错误了。
定位MAPPING_TEMPLATE
,代码如下:
public static final String MAPPING_TEMPLATE = "PUT /hotel\n" +
"{\n" +
" \"mappings\": {\n" +
" \"properties\": {\n" +
" \"id\": {\n" +
" \"type\": \"keyword\"\n" +
" },\n" +
" \"name\":{\n" +
" \"type\": \"text\",\n" +
" \"analyzer\": \"ik_max_word\",\n" +
" \"copy_to\": \"all\"\n" +
" },\n" +
" \"address\":{\n" +
" \"type\": \"keyword\",\n" +
" \"index\": false\n" +
" },\n" +
" \"all\":{\n" +
" \"type\": \"text\",\n" +
" \"analyzer\": \"ik_max_word\"\n" +
" }\n" +
" }\n" +
" }\n" +
"}\n";
OK,原因找到了,因为添加了这一点代码:"PUT /hotel\n" +