因为业务需求越来越变态,嵌套文档虽然香,但也架不住塞的东西太多,官方限制是10000,虽然可以改,但是我改了之后,发现还是有文档没录进去,遂寻求他法,最后尝试父子文档解决问题。其实不到万不得已,嵌套文档是效率最高的。
1.创建mapping
public static XContentBuilder corpMapping(){
XContentBuilder mapping = null ;
try {
mapping = jsonBuilder()
.startObject()
.startObject("properties")
.startObject("id").field("type","keyword").endObject()
.startObject("personId").field("type","keyword").endObject()
.startObject("prjType").field("type","keyword").endObject()
.startObject("prjAim").field("type","keyword").endObject()
.startObject("prjName").field("type","keyword").endObject()
//在此处声明父子关系
.startObject("companyPersonRelation")
.field("type","join")
.startObject("relations")
.field("company",new String[]{"personPerformance","corpPerformance"})
.endObject()
.endObject()
.endObject()
.endObject();
}catch (Exception e){
e.printStackTrace();
}
return mapping ;
}
插入文档
//处理子类关系,父类可以什么都不用处理,就普通那样子存,子类一定要表明自己父亲是谁
Map<String,String> map = new HashMap<>();
map.put("name","corpPerformance");
map.put("parent",corpId);
BulkRequest bulkRequest = new BulkRequest();
for (T tt : list) {
String id = getESId(tt) ;
//routing就是父类"_id"
String routingId = getRoutingId(tt) ;
IndexRequest request = new IndexRequest(index,type,id);
bulkRequest.add(request.routing(routingId).source(JSON.toJSONString(tt), XContentType.JSON));
}
bulkResponse = this.restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
查询
//这里的queryBuilder就是子类的各种查询条件,当你想要根据子类查询父类时,只需要将子类的条件放入HasChildQueryBuilder
//同理,要根据父类查询子类,只需用到HasParentQueryBuilder
HasChildQueryBuilder hcb = new HasChildQueryBuilder("corpPerformance",queryBuilder,Avg);
代码demo地址(暂时只有存储方法)