您的位置:首页 > 理论基础 > 计算机网络

ElasticSearch2.0 index中文乱码及解决问题

2015-11-30 21:00 591 查看
今天使用HttpClient 在ElasticSearch2.0上index documents时,由于document中包含有中文,浏览器打开一看,发现中文乱码,index的代码如下:

util.upload("test2", "水岸线接地网都!(!@!@u你好这是一份测试文档wdjqwdqu","c:\\test.txt","lpchou",new Date(),1,"lpchou")
/**
* 上传文档,成功返回文档id,否则返回null
* */
public String upload(String name,String content,String path,String author,
Date date,int level,String accessUserName){
String idString=null;
idString=indexDocument(name, content, path, author, date, level, accessUserName);
return idString;
}

/**
* 对Document建立索引,返回索引id
* */
private String indexDocument(String name,String content,String path,String author,
Date date,int level,String accessUserName){
Map<String,Object> documentMap=new HashMap<String,Object>();
documentMap.put(FIELD_NAME,name);documentMap.put(FIELD_CONTENT,content);
documentMap.put(FIELD_PATH,path);documentMap.put(FIELD_AUTHOR,author);
documentMap.put(FIELD_DATE,date.getTime());documentMap.put(FIELD_LEVEL,level);
documentMap.put(FIELD_ACCESS_USER_NAME,accessUserName);
return mElasticSerachService.indexContent(mIndex, mType, documentMap);
}

@Override
public String indexContent(String index, String type,
Map<String, Object> content) {
ObjectMapper objectMapper=new ObjectMapper();
try {
String jsonString=objectMapper.writeValueAsString(content);
return indexContent(index, type, jsonString);
} catch (JsonProcessingException e) {
e.printStackTrace();
return null;
}
}

@Override
public String indexContent(String index, String type, String jsonContent) {
String indexUri="http://"+mMasterNodeUrl+":"+mMasterNodePort+"/"+index+"/"+type
+"/";
StringEntity stringEntity=null;

try {
stringEntity = new StringEntity(jsonContent);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
System.out.println(stringEntity.toString());
JsonNode rootJsonNode=sendHttpPost(indexUri, stringEntity);
if(rootJsonNode!=null){
String id=rootJsonNode.get("_id").asText();
return id;
}
return null;
}


结果是能够进行index并得到id,但是打开浏览器一看,发现中文乱码,汉字全用"?"代替了,图中第一个中文没乱码因为我是用的JAVA API index的,后两个乱码的用的HttpClient的HttpPost来index的。



解决如下:

原因是我在index到ElasticSearch里的时候需要指定编码,方法为在使用HttpPost的时候需要传入一个StringEntity的参数,在构造StringEntity的时候设置编码为"UTF-8"即可,代码如下(注意与上面代码的区别)

@Override
public String indexContent(String index, String type, String jsonContent) {
String indexUri="http://"+mMasterNodeUrl+":"+mMasterNodePort+"/"+index+"/"+type
+"/";
StringEntity stringEntity=null;
stringEntity = new StringEntity(jsonContent,"UTF-8");
System.out.println(stringEntity.toString());
JsonNode rootJsonNode=sendHttpPost(indexUri, stringEntity);
if(rootJsonNode!=null){
String id=rootJsonNode.get("_id").asText();
return id;
}
return null;
}可以看到,在构造StringEntity的时候,如果指定了编码,连异常都没有了。再次Index后,浏览器查看结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息