業務場景:
一個樹形架構,承載了小區的數據,4層結構,如下圖所示
XX小區
--- XXX 號樓
--- XXX 單元
---- XXX房間
每個節點都有一個唯一的SpaceId,頁面下拉樹形結構,選中任何層級(比如選中5號樓),能查詢出5號樓下面的所有單元+房間
數據存儲在ES中,方案1:
房屋數據冗余一個字段longSpaceId,含義:當前房屋的所有層級spaceId
比如:101房間的spaceId=1234,他的父節點space=222,爺爺節點spaceId=12,頂級節點spaceId=1,那該值=,1,12,222,1234,
很容易理解把,我們根據選中的任意空間ID做個like查詢就行
GET face_platform_go_through_record/_search { "size": 100, "sort": [ { "recordTime": { "order": "desc" } } ], "query": { "bool": { "must": [ { "match": { "actionType": "1" } }, { "wildcard": { "longSpaceId": { "value": "*1022*" } } } ] } } }
java代碼實現如下:
qb2.must(QueryBuilders.wildcardQuery("longSpaceId", "*"+req.getSpaceId().toString()+"*"));
問題二:該小區有50棟樓,每個樓長負責2棟樓,默認查詢它負責的兩棟樓的數據
解決方案:新增字段longSpaces:以數組的形式存放每棟樓的所有spaceid,簡單說就是把上面的longSpaceId以數組的形式存儲到新的字段中
@Field(type = FieldType.Keyword) private List<Long> longSpaces;
一定要注意:該字段定義為keyword類型,否則默認就是text類型了
查詢就很簡單了,傳遞一個樓棟spaceId的數據,通過terms過濾一把即可
GET face_platform_go_through_record/_search { "size": 50, "query": { "bool": { "must": [ { "match": { "actionType": "1" } }, { "terms": { "longSpaces": [ "1976", "1022" ] } } ] } }, "sort": [ { "recordTime": { "order": "desc" } } ] }
java代碼實現:
qb2.must(QueryBuilders.termsQuery("longSpaces", req.getSpaceIds()));
注意:參數2是個List<Long>