亚洲一区精品自拍_2021年国内精品久久_男同十八禁gv在线观看_免费观看a级性爱黄片

Article / 文章中心

Elasticsearch中nested聚合操作

發(fā)布時間:2021-11-24 點(diǎn)擊數(shù):1037

ElasticSearch簡介(也稱ES)

Elasticsearch 是一個分布式可擴(kuò)展的實(shí)時搜索和分析引擎,一個建立在全文搜索引擎 Apache Lucene(TM) 基礎(chǔ)上的搜索引擎.當(dāng)然 Elasticsearch 并不僅僅是 Lucene 那么簡單,它不僅包括了全文搜索功能,還可以進(jìn)行以下工作:

  • 分布式實(shí)時文件存儲,并將每一個字段都編入索引,使其可以被搜索。
  • 實(shí)時分析的分布式搜索引擎。
  • 可以擴(kuò)展到上百臺服務(wù)器,處理PB級別的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)。

ElasticSearch數(shù)據(jù)類型

一級分類 二級分類 具體類型
基礎(chǔ)類型 字符串類型 string,text,keyword
-- 整數(shù)類型 integer,long,short,byte
-- 邏輯類型 boolean
-- 浮點(diǎn)類型 double,float,half_float,scaled_float
-- 日期類型 date
-- 范圍類型 range
-- 二進(jìn)制類型 binary
復(fù)合類型 數(shù)組類型 array
-- 對象類型 object
-- 嵌套類型 nested
地理類型 地理坐標(biāo)類型 geo_point
-- 地理地圖 geo_shape
特殊類型 IP類型 ip
-- 范圍地圖 completion
-- 令牌計(jì)數(shù)類型 token_count
-- 附件地圖 attachment
-- 抽取類型 percolator

以上便是ES中的數(shù)據(jù)類型,下面便對其中的object和nested來做一個簡單的介紹。

nested介紹

nested就是一個嵌套對象,是object數(shù)據(jù)類型的特殊版本,它允許對象數(shù)組相互獨(dú)立地進(jìn)行索引和查詢,使用時和其他類型使用基本相同,下面便是我來舉的一個例子,labels便是一個nested類型的數(shù)據(jù)

{ "settings": { "index": { "codec": "best_compression", "mapping": { "nested_fields": { "limit": "2000" }, "total_fields": { "limit": "10000" }
      }, "refresh_interval": "1s", "number_of_shards": "2", "translog": { "flush_threshold_size": "1gb", "sync_interval": "30s", "durability": "async" }, "number_of_replicas": "1" }
  }, "mappings": { "dynamic": true, "properties": { "id": { "type": "long", "doc_values": false, "index": false }, "name": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" }, "provinces": { "type": "keyword", "doc_values": false }, "city": { "type": "keyword" }, "permissionLevel": { "type": "integer", "doc_values": false, "index": false }, "status": { "type": "integer" }, "labels": { "type": "nested", "properties": { "label": { "type": "keyword" }, "classification": { "type": "keyword" }
        }
      }
    }
  }
}

當(dāng)需要使用這個嵌套類型中的數(shù)據(jù)進(jìn)行過濾,統(tǒng)計(jì)時我們普遍會使用這個來做一個聚合查詢,但是這個會出現(xiàn)一個問題,那便是,所聚合出來的數(shù)據(jù)只是nested對象的數(shù)據(jù),而外部主體數(shù)據(jù)并沒有聚合出來那便是一個問題

{ "size": 0, "query": { "bool": { "must": [
        { "nested": { "path": "labels", "query": { "term": { "labels.classification": "行業(yè)" }
            }
          }
        }
      ]
    }
  }, "aggs": { "genres": { "nested": { "path": "labels" }, "aggs": { "label_agg": { "terms": { "field": "labels.label" }, "aggs": { "count_sub": { "sum": { "field": "viewCpount" }
            }
          }
        }, "fll": { "filter": { "term": { "labels.classification": "行業(yè)" }
          }, "aggs": { "label_agg2": { "terms": { "field": "labels.label" }
            }
          }
        }
      }
    }
  }
}

之后,通過對官網(wǎng)文檔,還有同事的討論,當(dāng)對nested對象使用聚合查詢時,便需要時用reverse_nested,來回到root主體。這樣便能夠?qū)ested之外的數(shù)據(jù)來進(jìn)行聚合操作了。

{ "size": 0, "query": { "bool": { "must": [
        { "nested": { "path": "labels", "query": { "term": { "labels.classification": "c1" }
            }
          }
        }
      ]
    }
  }, "aggs": { "genres": { "nested": { "path": "labels" }, "aggs": { "fll": { "filter": { "term": { "labels.classification": "c1" }
          }, "aggs": { "label_agg2": { "terms": { "field": "labels.label" }, "aggs": { "res": { "reverse_nested": {}, "aggs": { "count_view": { "sum": { "field": "viewCount" }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}```