• 在elasticsearch中nested的使用


    git代码已经提交

    1.定义映射

    PUT /nest-test
    {
        "mappings":{
            "properties":{
                "deviceNo":{
                    "type": "keyword"
                },
                "status":{
                    "type": "integer"
                },
                "createTime": {
                    "type": "date",
                    "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                },
                "blackList":{
                    "type":"nested",
                    "properties":{
                        "deviceName":{
                            "type": "keyword"
                        },
                        "age": {
                            "type": "integer"
                        },
                        "detailInfo":{
                            "type":"text"
                        }
                    }
                }
            }
        },
        "settings": {
            "number_of_shards": "3",
            "number_of_replicas": "1",
            "translog": {
                "durability": "async"
            }
        }
    }

    2.插入数据

    POST /nest-test/_doc/1
    {
        "deviceNo": "ME0001",
        "status": 1,
        "createTime": "2022-08-26",
        "blackList":[
            {
                "deviceName": "微星1",
                "age": 19,
                "detailInfo":"这是一个很好用的运行工具,用来发电特别给力" 
            }
        ]
    }
    
    POST /nest-test/_doc/2
    {
        "deviceNo": "ME0002",
        "status": 0,
        "createTime": "2022-08-27",
        "blackList":[
            {
                "deviceName": "微星2",
                "age": 20,
                "detailInfo":"这是一个很好用的测试工具,用来测试特别给力" 
            }
        ]
    }
    
    POST /nest-test/_doc/3
    {
        "deviceNo": "ME0003",
        "status": 1,
        "createTime": "2022-08-28",
        "blackList":[
            {
                "deviceName": "微星3",
                "age": 21,
                "detailInfo":"这是一个很好用的修改工具,用来修改特别好" 
            }
        ]
    }
    
    
    POST /nest-test/_doc/4
    {
        "deviceNo": "ME0004",
        "status": 1,
        "createTime": "2022-08-28",
        "blackList":[
            {
                "deviceName": "微星3",
                "age": 21,
                "detailInfo":"这是一个很好用的书写工具,用来书写特别好" 
            }
        ]
    }

    3.测试

    普通的外围测试:

    GET /nest-test/_search
    {
      "query": {
        "term": {
          "deviceNo": {
            "value": "ME0001"
          }
        }
      }
    }

    测试nested

    GET /nest-test/_search
    {
      "query": {
        "nested": {
          "path": "blackList",
          "query": {
            "bool": {
              "must": [
                {
                  "term": {
                    "blackList.deviceName": {
                      "value": "微星3"
                    }
                  }
                },
                {
                  "match": {
                    "blackList.detailInfo": "书写"
                  }
                }
              ]
            }
          }
        }
      }
    }

      效果:

    {
      "took" : 18,
      "timed_out" : false,
      "_shards" : {
        "total" : 3,
        "successful" : 3,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 1,
          "relation" : "eq"
        },
        "max_score" : 3.180427,
        "hits" : [
          {
            "_index" : "nest-test",
            "_type" : "_doc",
            "_id" : "4",
            "_score" : 3.180427,
            "_source" : {
              "deviceNo" : "ME0004",
              "status" : 1,
              "createTime" : "2022-08-28",
              "blackList" : [
                {
                  "deviceName" : "微星3",
                  "age" : 21,
                  "detailInfo" : "这是一个很好用的书写工具,用来书写特别好"
                }
              ]
            }
          }
        ]
      }
    }

    嵌套与非嵌套一起查询

    GET /nest-test/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "deviceNo": {
                  "value": "ME0004"
                }
              }
            },
            {
              "nested": {
                "path": "blackList",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "term": {
                          "blackList.deviceName": {
                            "value": "微星3"
                          }
                        }
                      },
                      {
                        "match": {
                          "blackList.detailInfo": "书写"
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }

    4.java测试

        @Override
        public List<String> searchNested(String index) {
            List<String> result = Lists.newArrayList();
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            // 非嵌套的查询
            TermQueryBuilder query1 = QueryBuilders.termQuery("deviceNo", "ME0004");
            // 写嵌套下的query2
            BoolQueryBuilder nestedBoolQueryBuilder = QueryBuilders.boolQuery();
            nestedBoolQueryBuilder.must(QueryBuilders.termQuery("blackList.deviceName", "微星3"));
            nestedBoolQueryBuilder.must(QueryBuilders.matchQuery("blackList.detailInfo", "书写"));
            NestedQueryBuilder query2 = QueryBuilders.nestedQuery("blackList", nestedBoolQueryBuilder, ScoreMode.None);
    
            // 将非嵌套与嵌套的查询进行组合
            boolQueryBuilder.must(query1);
            boolQueryBuilder.must(query2);
            SearchResponse searchResponse = commonQuery(index, boolQueryBuilder, 0, 10);
            if(Objects.nonNull(searchResponse)){
                // 解析
                SearchHit[] hits = searchResponse.getHits().getHits();
                for (SearchHit hit : hits){
                    String sourceAsString = hit.getSourceAsString();
                    result.add(sourceAsString);
                }
                return result;
            }
            return result;
    
        }
  • 相关阅读:
    IDEA工具-快捷键整理
    Intellij热部署插件JRebel_转载
    [刘阳Java]_为什么要前后端分离
    [刘阳Java]_程序员Java编程进阶的5个注意点,别编程两三年还是增删改查
    [刘阳Java]_Web前端入门级练习_迅雷首页第一屏设计
    [刘阳Java]_Web前端入门级练习_迅雷官宣网设计
    [刘阳Java]_MySQL数据优化总结_查询备忘录
    Mybatis总结(一)
    java.io.IOException: Could not find resource com/xxx/xxxMapper.xml
    push to origin/master was rejected错误解决方案
  • 原文地址:https://www.cnblogs.com/juncaoit/p/16637143.html
Copyright © 2020-2023  润新知