Java創建ES父子文檔及查詢

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章