elasticsearch之十九springboot測(cè)試高級(jí)搜索聚合

個(gè)人專(zhuān)題目錄](méi)(http://www.reibang.com/p/140e2a59db2c)

1. elasticsearch高級(jí)搜索聚合

聚合分析是數(shù)據(jù)庫(kù)中重要的功能特性瑟枫,完成對(duì)一個(gè)查詢的數(shù)據(jù)集中數(shù)據(jù)的聚合計(jì)算,如:找出某字段(或計(jì)算表達(dá)式的結(jié)果)的最大值、最小值,計(jì)算和帅刊、平均值等。ES作為搜索引擎兼數(shù)據(jù)庫(kù)欲逃,同樣提供了強(qiáng)大的聚合分析能力灰瞻。

1.1 cardinality去重計(jì)數(shù)

其作用是對(duì)選擇字段先執(zhí)行類(lèi)似sql中的distinct操作,去掉集合中的重復(fù)項(xiàng)干跛,然后統(tǒng)計(jì)排重后的集合長(zhǎng)度子姜。
總共有多少不同的值 相當(dāng)于SQL中的 select count(distinct clusterId) from table

POST /book-index/_search
{
  "from": 0,
  "size": 100,
  "aggregations": {
    "agg": {
      "cardinality": {
        "field": "categoryName"
      }
    }
  }
}
@Override
public void cardinalityAggregations(String indexName, String field) throws Exception {
    CardinalityAggregationBuilder aggregationBuilder = AggregationBuilders.cardinality("agg").field(field);
    baseQuery.builder(indexName, null, null, aggregationBuilder);
}
@Test
public void testCardinalityAggregations() throws Exception {
    aggregationQuery.cardinalityAggregations(Constants.INDEX_NAME, "categoryName");
    aggregationQuery.cardinalityAggregations(Constants.INDEX_NAME, "brandName");
}

1.2 range統(tǒng)計(jì)

range統(tǒng)計(jì)能夠獲取得到一個(gè)屬于指定范圍集的文檔的個(gè)數(shù)。除些之外楼入,還能夠獲取指定字段的聚合數(shù)據(jù)哥捕。例如,我們可以某個(gè)數(shù)值字段中小于100浅辙,100200扭弧,200300三外范圍內(nèi)的文檔個(gè)數(shù),還可以用在日期记舆,IP地址范圍統(tǒng)計(jì) 鸽捻。

統(tǒng)計(jì)2011以前,2011~2019泽腮,2019及以后的文檔數(shù):

POST /book-index/_search
{
  "from": 0,
  "size": 100,
  "aggregations": {
    "agg": {
      "date_range": {
        "field": "createTime",
        "format": "yyyy",
        "ranges": [
          {
            "to": "2011"
          },
          {
            "from": "2011",
            "to": "2019"
          },
          {
            "from": "2019"
          }
        ],
        "keyed": false
      }
    }
  }
}
@Override
public void dateRangeAggregation(String indexName, String field) throws Exception {
    AggregationBuilder agg1 = AggregationBuilders.dateRange("agg").field(field).format("yyyy").
            addUnboundedTo("2011").
            addRange("2011", "2019")
            .addUnboundedFrom("2019");
    baseQuery.builder(indexName, null, null, agg1);
}
@Test
public void testDateRangeAggregation() throws Exception {
    aggregationQuery.dateRangeAggregation(Constants.INDEX_NAME, "createTime");
}

1.3 histogram 統(tǒng)計(jì)

histogram 統(tǒng)計(jì)能夠?qū)ψ侄稳≈蛋撮g隔統(tǒng)計(jì)建立直方圖(針對(duì)數(shù)值型和日期型字段)御蒲。

比如我們以5為間隔,統(tǒng)計(jì)不同區(qū)間的诊赊,現(xiàn)在想每隔5就創(chuàng)建一個(gè)桶厚满,統(tǒng)計(jì)每隔區(qū)間都有多少個(gè)文檔:

POST /book-index/_search
{
  "from": 0,
  "size": 100,
  "aggregations": {
    "agg": {
      "histogram": {
        "field": "price",
        "interval": 1000,
        "offset": 0,
        "order": {
          "_key": "asc"
        },
        "keyed": false,
        "min_doc_count": 0
      }
    }
  }
}
/**
 * histogram 統(tǒng)計(jì)能夠?qū)ψ侄稳≈蛋撮g隔統(tǒng)計(jì)建立直方圖
 *
 * @param indexName 索引名稱(chēng)
 * @param field     字段名稱(chēng)
 * @param interval  間段值
 * @throws Exception
 */
@Override
public void histogramAggregation(String indexName, String field, int interval) throws Exception {
    AggregationBuilder agg1 = AggregationBuilders.histogram("agg").field(field).interval(interval);
    baseQuery.builder(indexName, null, null, agg1);
}
@Test
public void testHistogramAggregation() throws Exception {
    aggregationQuery.histogramAggregation(Constants.INDEX_NAME, "price", 1000);
}

1.4 date_histogram統(tǒng)計(jì)

histogram 除了對(duì)數(shù)值統(tǒng)計(jì)外,還提供了date_histogram統(tǒng)計(jì)類(lèi)型碧磅,可以應(yīng)用于日期字段類(lèi)型碘箍。date_histogram允許我們使用year,month,week,day,hour或minute等常量作為interval屬性的取值遵馆。

支持的日期格式:

public static final DateHistogramInterval SECOND = new DateHistogramInterval("1s");
public static final DateHistogramInterval MINUTE = new DateHistogramInterval("1m");
public static final DateHistogramInterval HOUR = new DateHistogramInterval("1h");
public static final DateHistogramInterval DAY = new DateHistogramInterval("1d");
public static final DateHistogramInterval WEEK = new DateHistogramInterval("1w");
public static final DateHistogramInterval MONTH = new DateHistogramInterval("1M");
public static final DateHistogramInterval QUARTER = new DateHistogramInterval("1q");
public static final DateHistogramInterval YEAR = new DateHistogramInterval("1y");

例如創(chuàng)建時(shí)間以天為單位來(lái)統(tǒng)計(jì)文檔數(shù)量:

POST /book-index/_search
{
  "from": 0,
  "size": 100,
  "aggregations": {
    "agg": {
      "date_histogram": {
        "field": "createTime",
        "calendar_interval": "1d",
        "offset": 0,
        "order": {
          "_key": "asc"
        },
        "keyed": false,
        "min_doc_count": 0
      }
    }
  }
}
/**
 * histogram 統(tǒng)計(jì)能夠?qū)ψ侄稳≈蛋撮g隔統(tǒng)計(jì)建立直方圖
 *
 * @param indexName 索引名稱(chēng)
 * @param field     字段名稱(chēng)
 * @param interval  間段值
 * @throws Exception
 */
@Override
public void histogramDateAggregation(String indexName, String field, int interval) throws Exception {
    AggregationBuilder agg1 = AggregationBuilders.dateHistogram("agg").field(field)
            .calendarInterval(DateHistogramInterval.DAY)
            .calendarInterval(DateHistogramInterval.days(interval));
    baseQuery.builder(indexName, null, null, agg1);
}
@Test
public void testHistogramDateAggregation() throws Exception {
    aggregationQuery.histogramDateAggregation(Constants.INDEX_NAME, "createTime", 1);
}

1.5 extended_stats統(tǒng)計(jì)聚合

extended_stats統(tǒng)計(jì)使得我們可以對(duì)一個(gè)數(shù)值型字段計(jì)算統(tǒng)計(jì)信息。我們能夠得到個(gè)數(shù)丰榴、總和货邓、平方和、均值四濒、最小值换况、最大值、方差及標(biāo)準(zhǔn)差盗蟆。

POST /book-index/_search
{
  "from": 0,
  "size": 100,
  "aggregations": {
    "agg": {
      "extended_stats": {
        "field": "price",
        "sigma": 2
      }
    }
  }
}
@Override
public void extendedStatsAggregation(String indexName, String field) throws Exception {
    ExtendedStatsAggregationBuilder agg1 = AggregationBuilders.extendedStats("agg").field(field);
    baseQuery.builder(indexName, null, null, agg1);
}
@Test
public void testExtendedStatsAggregation() throws Exception {
    aggregationQuery.extendedStatsAggregation(Constants.INDEX_NAME, "price");
}

1.6 terms_stats統(tǒng)計(jì)

terms_stats統(tǒng)計(jì)提供了在一個(gè)字段上基于另一個(gè)字段獲得的取值進(jìn)行統(tǒng)計(jì)的能力戈二。

例如對(duì)fee字段進(jìn)行平均值統(tǒng)計(jì),同時(shí)希望根據(jù)省份字段對(duì)統(tǒng)計(jì)值進(jìn)行劃分喳资。

PPOST /book-index/_search
{
  "from": 0,
  "size": 100,
  "query": {
    "range": {
      "createTime": {
        "from": "2015-03-08 00:00:00",
        "to": "2020-03-08 00:00:00",
        "include_lower": true,
        "include_upper": true,
        "boost": 1
      }
    }
  },
  "aggregations": {
    "brandName": {
      "terms": {
        "field": "brandName",
        "size": 10,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "_count": "desc"
          },
          {
            "_key": "asc"
          }
        ]
      },
      "aggregations": {
        "avg_request_stock": {
          "avg": {
            "field": "stock"
          }
        }
      }
    }
  }
}
@Override
public void termsAggregation(String indexName, String startTime, String endTime) throws Exception {
    RangeQueryBuilder queryBuilder = QueryBuilders.rangeQuery("createTime").from(startTime).to(endTime);
    //text類(lèi)型不能用于索引或排序觉吭,必須轉(zhuǎn)成keyword類(lèi)型
    TermsAggregationBuilder aggregation = AggregationBuilders.terms("brandName").field("brandName");
    //avg_age 為子聚合名稱(chēng),名稱(chēng)可隨意
    aggregation.subAggregation(AggregationBuilders.avg("avg_request_stock").field("stock"));
    baseQuery.builder(indexName, queryBuilder, null, aggregation);
}
@Test
public void testTermsAggregation() throws Exception {
    aggregationQuery.termsAggregation(Constants.INDEX_NAME, "2015-03-08 00:00:00", "2020-03-08 00:00:00");
}

1.7 geo_distance統(tǒng)計(jì)

全用該類(lèi)型可以獲得給定位置某個(gè)距離范圍內(nèi)的文檔個(gè)數(shù)骨饿。

比如:利用第七節(jié)中的數(shù)據(jù)亏栈,統(tǒng)計(jì)離廈門(mén)(0100公里,100500公里,500~5000公里)索引中的文檔數(shù)量宏赘。

POST /map/cp/_search
{
    "aggregations": {
        "agg": {
            "geo_distance": {
                "field": "location",
                "origin": {
                    "lat": 40.1225,
                    "lon": 116.2577
                },
                "ranges": [{
                    "key": "*-100.0",
                    "from": 0.0,
                    "to": 100.0
                }, {
                    "key": "100.0-500.0",
                    "from": 100.0,
                    "to": 500.0
                }, {
                    "key": "500.0-5000.0",
                    "from": 500.0,
                    "to": 5000.0
                }],
                "keyed": false,
                "unit": "km",
                "distance_type": "ARC"
            }
        }
    }
}
@Override
public void geoDistanceAggregation(String indexName) throws Exception {
    GeoDistanceAggregationBuilder geoDistanceAggregationBuilder = AggregationBuilders.geoDistance("agg", new GeoPoint(40.1225, 116.2577))
            .field("location")
            .unit(DistanceUnit.KILOMETERS)
            .addUnboundedTo(100)
            .addRange(100, 500)
            .addRange(500, 5000);

    baseQuery.builder(indexName, null, null, geoDistanceAggregationBuilder);
}
@Test
public void testGeoDistanceAggregation() throws Exception {
    aggregationQuery.geoDistanceAggregation("cn_large_cities");
}

1.8 其他

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绒北,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子察署,更是在濱河造成了極大的恐慌闷游,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贴汪,死亡現(xiàn)場(chǎng)離奇詭異脐往,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)扳埂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)业簿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人阳懂,你說(shuō)我怎么就攤上這事梅尤。” “怎么了岩调?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵巷燥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我号枕,道長(zhǎng)缰揪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任葱淳,我火速辦了婚禮钝腺,結(jié)果婚禮上抛姑,老公的妹妹穿的比我還像新娘。我一直安慰自己拍屑,他們只是感情好途戒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著僵驰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唁毒。 梳的紋絲不亂的頭發(fā)上蒜茴,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音浆西,去河邊找鬼粉私。 笑死,一個(gè)胖子當(dāng)著我的面吹牛近零,可吹牛的內(nèi)容都是我干的诺核。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼久信,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窖杀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起裙士,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤入客,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后腿椎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體桌硫,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年啃炸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铆隘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡南用,死狀恐怖膀钠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情训枢,我是刑警寧澤托修,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站恒界,受9級(jí)特大地震影響睦刃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜十酣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一涩拙、第九天 我趴在偏房一處隱蔽的房頂上張望际长。 院中可真熱鬧,春花似錦兴泥、人聲如沸工育。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)如绸。三九已至,卻和暖如春旭贬,著一層夾襖步出監(jiān)牢的瞬間怔接,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工稀轨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扼脐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓奋刽,卻偏偏與公主長(zhǎng)得像瓦侮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佣谐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容