ES中模糊查詢的實現


業務場景:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM