你们好,我是金金金。
场景
- 我正在使用
Springboot
整合elasticsearch
,在创建索引(分词器) 运行报错,如下
排查
排查之前我先贴一下代码
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; // 注意这个包
@SpringBootTest
public class RestHighLevelClientTest {
// 当前客户端是手工维护的,因此不能通过自动装配的形式加载对象
private RestHighLevelClient client;
@BeforeEach
void setUp() {
HttpHost host = HttpHost.create("http://localhost:9200"); // 配置ES服务器地址与端口9200
RestClientBuilder builder = RestClient.builder(host);
client = new RestHighLevelClient(builder);
}
@AfterEach
void tearDown() throws IOException {
client.close();
}
@Test
void testCreateIndexByIK() throws IOException {
CreateIndexRequest request = new CreateIndexRequest("books");
String json = "{\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" +
" \"type\": {\n" +
" \"type\": \"keyword\"\n" +
" },\n" +
" \"description\": {\n" +
" \"type\": \"text\",\n" +
" \"analyzer\": \"ik_max_word\",\n" +
" \"copy_to\": \"all\"\n" +
" },\n" +
" \"all\": {\n" +
" \"type\": \"text\",\n" +
" \"analyzer\": \"ik_max_word\"\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
//设置请求中的参数
request.source(json, XContentType.JSON);
client.indices().create(request, RequestOptions.DEFAULT);
}
}
- 上面就是我的测试代码,很可惜它报错了。
- 之前我在
postman
测试发送的请求参数没报错,所以我就很纳闷
所以我怀疑是不是在代码里面是不是写法不一样?当然我也在百度找到了方法,请看解决
造成error的原因
缺少参数导致识别不了(导入对包就没这个问题)
- 我当前导入的
CreateIndexRequest
包是import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
下的
解决
第一种解决方式: 当导入的是import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
,在json请求参数
里面需要加上一个type_name
属性
可能不太建议这种方式,毕竟idea爆出了如下提示,还是用第二种方式吧
第二种解决方式: 当然也可以不加 type_name
也一样可以成功,导入import org.elasticsearch.client.indices.CreateIndexRequest;
这个包下的CreateIndexRequest
即可
- 编写有误还请大佬指正,万分感谢。