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;

    }

 

 posted on 2022-08-29 19:42  曹军  阅读(274)  评论(0编辑  收藏  举报