zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    html area标签 语法
    html applet标签 语法
    html address标签 语法
    html acronym标签 语法
    html abbr标签 语法
    html a标签 语法
    mysql MAX()函数 语法
    mysql LAST()函数 语法
    mysql FIRST()函数 语法
    mysql COUNT()函数 语法
  • 原文地址:https://www.cnblogs.com/huahua035/p/13508574.html
Copyright © 2011-2022 走看看