[ElasticSearch]ES操作之嵌套查詢(nested)與退出嵌套(reverse_nested)操作


嵌套類型的基本概念就不講了,需要了解概念的,傳送門:https://www.cnblogs.com/just84/p/10936034.html

 

對於嵌套類型的字段,要使用ES專用的嵌套查詢

 

嵌套字段舉例:

      brandInfo:[
​            {
​              "group": "xx",
​              "category": "xx",
​              "subCategory": "xx",
​              "brand": "xx",
​              "subBrand": "xx",
​              "propertyWord": [
​                "xx",
​                "xx",
​                "xx"
​              ]
​            }
      ]

 

如果要獲取subBrand的分組  就需要這樣實現:

    "aggs": {
        "brandInfo": {
          "nested": {
            "path": "brandInfo"
          },
          "aggs": {
            "brands": {
              "terms": {
                "field": "brandInfo.subBrand",
                "size": xx
              }
            }
          }
        }
      }

 

如果要在subBrand分組的條件上,進行propertyWord的分組,也很簡單:

    "aggs": {
        "brandInfo": {
          "nested": {
            "path": "brandInfo"
          },
          "aggs": {
            "brands": {
              "terms": {
                "field": "brandInfo.subBrand",
                "size": 10
              },
              "aggs": {
                "property": {
                  "terms": {
                    "field": "brandInfo.propertyWord",
                    "size": 100
                  }
                }
              }
            }
          }
        }
      }

 

需求往往是多變的

如果突然在subBrand的分組下,還要進行 非嵌套字段 的分組,比如名稱,性別,年齡等,如何實現呢?

這個時候一般都會想,和上邊一樣唄,如下:

    "aggs": {
        "brandInfo": {
          "nested": {
            "path": "brandInfo"
          },
          "aggs": {
            "brands": {
              "terms": {
                "field": "brandInfo.subBrand",
                "size": 3
              },
         "aggs": {
                 "gender": {
                   "terms": {
                     "field": "gender",
                     "size": 3
                   }
                 }
               }
            }
            }
          }
        }

但這樣是查不到性別分組數據的

原因是:  進入了嵌套桶中,只能操作嵌套字段.

 

后來了解到,可以通過 reverse_nested  跳出當前嵌套,並且  依然攜帶之前的分組條件   

    "aggs": {
        "brandInfo": {
          "nested": {
            "path": "brandInfo"
          },
          "aggs": {
            "brands": {
              "terms": {
                "field": "brandInfo.subBrand",
                "size": 3
              },
              "aggs": {
                "rev": {
                  "reverse_nested": {},  //跳出嵌套桶
                  "aggs": {
                    "age": {
                      "terms": {
                        "field": "gender",
                        "size": 3
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }

問題解決.

 

用java實現也很簡單,相關的嵌套和跳出嵌套代碼片段:

//解析嵌套字段
Map<String, Aggregation> brandInfo =((Nested) result.get("brandInfo")).getAggregations().getAsMap();
//品牌
List<Terms.Bucket> bucketList = ((Terms) brandInfo.get("brands")).getBuckets();
for (Terms.Bucket bucket : bucketList) {
  //跳出嵌套
  Map<String, Aggregation> revInfo =((ReverseNested) bucket.getAggregations().get("rev")).getAggregations().getAsMap();
  //一級維度
  List<Terms.Bucket> genders = ((Terms) revInfo.get("gender")).getBuckets();
  //封裝數據
  for (Terms.Bucket gender : genders) {
    //TODO
  }
}

 


免責聲明!

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



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