因爲業務需求越來越變態,嵌套文檔雖然香,但也架不住塞的東西太多,官方限制是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);