業務場景:
一個樹形架構,承載了小區的數據,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>
