弹性搜索不是x内容异常

时间:2016-03-02 07:02:37

标签: java elasticsearch

我一直在尝试使用以下代码通过java将数据放入弹性搜索中:

String url = "http://localhost:9200/testindex2/test/2";
    HttpClient client = new DefaultHttpClient();

    HttpPut put = new HttpPut(url);
    JSONObject json = new JSONObject();

    json.put("email", "abc@abof.com");
    json.put("first_name", "abc");
    StringEntity se = new StringEntity("JSON: " + json.toString());
    se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"Text"));
    put.setEntity(se);

    HttpResponse response = client.execute(put);
    System.out.println("\nSending 'PUT' request to URL : " + url);
    System.out.println("Put parameters : " + put.getEntity());
    System.out.println("Response Code : " + response.getStatusLine().getStatusCode());

   BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

    StringBuffer result = new StringBuffer();
    String line = "";
    while ((line = rd.readLine()) != null) {
        result.append(line);
    }

    System.out.println(result.toString());

我收到以下错误:

  

发送' PUT'请求网址:http://localhost:9200/testindex2/test/2       放参数:[Content-Type:text / plain; charset = ISO-8859-1,内容编码:文本,内容长度:   52,Chunked:false]       回复代码:400       {"错误" {" ROOT_CAUSE":[{"类型":" mapper_parsing_exception""理由":& #34;失败   解析"}],"输入":" mapper_parsing_exception","原因":"未能   解析"" caused_by" {"类型":" not_x_content_exception""理由":"压缩机   检测只能在某些xcontent字节上调用或压缩   xcontent bytes"}}," status":400}

此外,当我从其他客户端尝试相同的代码时,它运行得很好,不知道为什么会出现这个问题。

4 个答案:

答案 0 :(得分:3)

代替

 StringEntity se = new StringEntity("JSON: " + json.toString());
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"Text"));

用这个:

StringEntity se = new StringEntity(json.toString(),ContentType.APPLICATION_JSON);

及其现在的工作

答案 1 :(得分:0)

弹性搜索具有特殊的client以使用Java。而且您不需要手动生成JSON。此外,您没有描述导入部分,因此有点难以理解您使用的库。

答案 2 :(得分:0)

我遇到了同样的错误,但就我而言,我实际上是在Kubernetes配置中为初始化容器做类似的事情:

- args:
        - -XPUT
        - -k
        - {{.Values.kibana.env.ELASTICSEARCH_URL}}/.logtrail/config/1?pretty
        - -H
        - 'Content-Type: application/json'
        - --data
        - /etc/logtrail/logtrail.json

这里的问题是,当您在curl POST / PUT中指定文件时,需要在文件后附加'@'。因此,以下配置有效!

- args:
        - -XPUT
        - -k
        - {{.Values.kibana.env.ELASTICSEARCH_URL}}/.logtrail/config/1?pretty
        - -H
        - 'Content-Type: application/json'
        - --data
        - '@/etc/logtrail/logtrail.json'

答案 3 :(得分:0)

 uri = 'http://projects.local:9200/'
_index = 'mydata/'
_type = '_doc/'
head = {'Content-Type': 'application/json'}
body = {
"capital" : "boston",
"state" : "massachusetts"  
}

使用 json.dumps 将 body 转换为 jbody 对我有用

jbody = json.dumps(body)

response = requests.post(uri+_index+_type, headers=head, data=jbody)