ElasticSearch入門教程

一砂蔽、ES概述

1.1渐北、ES介紹

ElasticSearch簡稱ES放钦,是一個基于Lucene開發(fā)的 分布式的全文搜索引擎畦浓,它可以近實時的存儲普泡、檢索數(shù)據(jù)齿坷。

而Lucene是一個開源的全文檢索引擎的工具包拯钻,他本身不是一個完整的全文檢索引擎膀估。

ES官網(wǎng)文檔地址:https://www.elastic.co/guide/en/elasticsearch/reference/7.3/index.html

1.2躁倒、ES基本概念

ES和關(guān)系型數(shù)據(jù)庫對比:

關(guān)系型數(shù)據(jù)庫(Mysql) ElasticSeach
數(shù)據(jù)庫(database) 索引(index)
表(tables) 類型(types)
行(rows) 文檔(documnets)
列字段(columns) 字段(fields)
  • 集群(Cluster):是一組具有相同集群名的節(jié)點集合
  • 節(jié)點(Node):一個ES集群由多個節(jié)點組成荞怒,一個節(jié)點就是集群中的一個服務(wù)器。
  • 分片(Shard): 一個索引的數(shù)據(jù)保存在多個分片中秧秉,每個分片都是一個完整的Lucene實例褐桌,對相同索引可以進(jìn)行水平擴(kuò)展。
  • 副本(Replicas):就是分片的復(fù)制象迎,提高數(shù)據(jù)的可靠性荧嵌。
  • 索引(Index):由具有相同結(jié)構(gòu)(field)的文檔(document)組成集合。每個索引都有自己的mapping定義砾淌,用于定義字段名和類型啦撮。
  • 類型(Type):類型是文檔的邏輯容器(在ES7中使用默認(rèn)的_doc作為唯一的type,在后續(xù)版本中將被徹底刪除)
  • 文檔(Document):存儲在ES的數(shù)據(jù)文檔汪厨,JSON格式赃春,由字段field組成。

如下所示劫乱,一個由三個節(jié)點組成的集群织中,示意圖:

ES集群

二、ES基本原理

2.1衷戈、ES架構(gòu)

ES架構(gòu)

2.2狭吼、ES索引

索引是為了快速檢索數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu),對于我們熟悉的Mysql殖妇,采用的是B+樹(Innodb引擎)刁笙,而ES采用的是一種倒排索引的數(shù)據(jù)結(jié)構(gòu)。

  • 正排索引
正排.PNG

是以ID查詢對應(yīng)的數(shù)據(jù)記錄谦趣,是一種key-value的查詢過程疲吸。

  • 倒排索引(Inverted Index)

    一個倒排索引由文檔中所有不重復(fù)詞的列表構(gòu)成,對于其中的每個詞蔚润,有一個包含它的文檔列表磅氨。

    倒排.PNG

假如有以下兩個文檔:

  1. The quick brown fox jumped over the lazy dog
  2. Quick brown foxes leap over lazy dogs in summer

為了創(chuàng)建倒排索引,先將每個文檔進(jìn)行分詞嫡纠,創(chuàng)建一個包含所有不重復(fù)詞條的排序列表,并列出每個詞出現(xiàn)在哪個文檔中。結(jié)果如下:

倒排結(jié)果

假如現(xiàn)在除盏,要查詢quick brown叉橱,只需要查找出包含每個詞條的文檔:

倒排查詢

如上所述,兩個文檔都匹配者蠕,但是第一個比第二個匹配度更高窃祝。

2.3、分詞和分詞器

分詞就是將文本轉(zhuǎn)換成一系列單詞的過程踱侣,也叫做文本分析粪小,在ES中成為Analysis。

分詞器(Analysis)組成如下:

組成 功能
Character Filter 對字符串進(jìn)行預(yù)處理抡句,比如去除html標(biāo)記符等
Tokenizer 將原始文本按照一定的規(guī)則切分為單個詞條
Token Filters 針對tokenizer處理的單詞進(jìn)行再加工探膊,
比如轉(zhuǎn)換為小寫、刪除或新增等待榔。

分詞器調(diào)用順序過程如下:

分詞過程

如下是ES自建的分詞器:

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/analysis-analyzers.html

2.4逞壁、建立索引和搜索過程

建索引及搜索過程.PNG

建索引:數(shù)據(jù)入庫時,需要經(jīng)過分詞后锐锣,建立正排和倒排索引腌闯,并持久化到硬盤中。

搜索:搜索的時候雕憔,同樣需要經(jīng)過分詞姿骏,再根據(jù)分詞后的結(jié)果到正排和倒排索引中查找匹配的文檔。

2.4斤彼、IK分詞器

IK分詞器:是一個中文分詞器分瘦,并且支持自定義字典。他支持兩種分詞算法ik_max_word和ik_smart畅卓。

  • ik_max_word:會將文本做最細(xì)粒度的拆分
  • ik_smart:會將文本做最粗粒度的拆分

一般來說擅腰,對于文檔入庫時,我們希望文本分詞拆的越細(xì)越好翁潘,這樣搜索的時候更能匹配到內(nèi)容趁冈。而搜索的時候,我們希望匹配度越高越好拜马。所以一般入庫使用ik_max_word算法渗勘,而查詢的時候使用ik_smart算法。

https://github.com/medcl/elasticsearch-analysis-ik

三俩莽、ES基本操作

ES提供了REST風(fēng)格的API旺坠,用于操作數(shù)據(jù)。

3.1 扮超、文檔API

3.1.1取刃、新增

  • 單條新增:
POST /content/_doc/123456
 {
     "aid":"V123456",
     "type":"t800000",
     "time":1583824758000,
     "data":{"keyword":"占某某"}
 }
  • 批量新增
 POST /_bulk
 {"index": {"_index": "content", "_id": "11"}}
 {"aid":"V123456","type":"t800000","time":1583824758000,"data":{"keyword":"占某某11"}}
 {"index": {"_index": "content", "_id": "22"}}
 {"aid":"V123456","type":"t800000","time":1583824758000,"data":{"keyword":"占某某22"}}

3.1.2蹋肮、刪除

  • 指定ID刪除單條數(shù)據(jù)

    如下,刪除指定id=11的數(shù)據(jù):

DELETE /content/_doc/11
  • 根據(jù)條件刪除指定數(shù)據(jù)

    如下璧疗,通過_delete_by_query坯辩,刪除aid="V123456"的數(shù)據(jù):

 POST /content/_delete_by_query
 {
   "query":{
     "term":{
       "aid":"V123456"
     }
   }
 }

如下,通過_delete_by_query崩侠,刪除 _id為11和33的數(shù)據(jù):

 POST /content/_delete_by_query
 {
   "query":{
     "terms":{
       "_id":["11","33"]
     }
   }
 }

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/docs-delete-by-query.html

3.1.3漆魔、修改

  • 使用腳本更新指定id的文檔
POST /content/_update/11
{
  "script" : {
    "source": "ctx._source.time= params.time",
    "lang": "painless",
    "params" : {
      "time" : "2020-12-08 16:00:00"
    }
  }
}
  • doc部分文檔字段更新
POST /content/_update/11
{
  "doc" : {
    "time" : "2020-12-08 16:00:00"
  }
}
  • upsert更新

假如文檔內(nèi)容不存在,則將內(nèi)容upsert元素作為新數(shù)據(jù)插入却音,否則更新操作執(zhí)行script

POST /content/_update/11
{
    "script" : {
      "source": "ctx._source.time= params.time",
      "lang": "painless",
      "params" : {
        "time": "2020-12-11 16:00:00"
      }
    },
    "upsert" : {
      "aid": "V123456",
      "type": "t800000",
      "time": "2020-12-12 16:00:00",
      "data": {
        "keyword": "占某某2"
      }
    }
}
  • update_by_query更新

根據(jù)條件進(jìn)行更新

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/docs-update.html

3.1.4改抡、其他REST接口

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/rest-apis.html

3.2、DSL查詢

DSL:Domain Specific Language(特定領(lǐng)域語言)的縮寫系瓢。

ES提供基于JSON的查詢功能阿纤,將DSL查詢看做AST樹(Abstract Syntax Tree),他包含兩部分:

  • Leaf query clauses:葉子節(jié)點查詢子句在特定字段中查找特定值,如match八拱、term阵赠、或者range查詢等
  • Compound query clauses:復(fù)合查詢子句包裝了其他葉子或復(fù)合查詢,用于邏輯方式組合的多個查詢肌稻,如bool清蚀、dis_max查詢等

3.2.1、全文查詢

全文查詢可以搜索已被分析的文本字段爹谭,只能找到相似的文檔枷邪,并給出對應(yīng)文檔的評分,評分越高诺凡,則相似度越高东揣。

  • match查詢

match:模糊匹配,需要指定字段名腹泌,輸入會進(jìn)行分詞嘶卧,分詞后再進(jìn)行匹配。

POST /content/_search
{
 "from": 0,
 "size": 20,
 "query": {
   "match": {
      "data.keyword": "紅色占某某"
    }
 }
}

并且match查詢凉袱,可以通過operator來進(jìn)行boolean邏輯匹配控制芥吟,值有:or、and

POST /content/_search
{
 "from": 0,
 "size": 20,
 "query": {
   "match": {
      "data.keyword": {
        "query": "紅色占某某",
        "operator": "and"
      }
    }
 }
}

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-match-query.html

  • match_bool_prefix查詢

match_bool_prefix會解析檢索詞专甩,然后生成一個bool復(fù)合檢索語句钟鸵。如果檢索詞由很多個token構(gòu)成,除了最后一個會進(jìn)行prefix匹配涤躲,其他的會進(jìn)行term匹配棺耍。

POST /content/_search
{
 "query": {
   "match_bool_prefix": {
      "data.keyword": {
        "query": "quick brown f"
      }
    }
 }
}

等價于:

GET /_search
{
    "query": {
        "bool" : {
            "should": [
                { "term": { "message": "quick" }},
                { "term": { "message": "brown" }},
                { "prefix": { "message": "f"}}
            ]
        }
    }
}

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-match-bool-prefix-query.html

  • multi_phrase查詢

詞組匹配會先解析檢索詞,并且標(biāo)注出每個的token相對位置种樱,搜索匹配的字段的必須包含所有的檢索詞的token蒙袍,并且他們的相對位置也要和檢索詞里面相同俊卤。

POST /content/_search
{
 "query": {
   "match_phrase": {
      "data.keyword": {
        "query": "紅色占某某"
      }
    }
 }
}
以上查詢只能匹配:“紅色占某某”,但不能匹配“占某某紅色”

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-match-query-phrase.html

  • multi_match查詢

multi_match:多字段模糊查詢左敌,和match類似都是模糊查詢瘾蛋,但multi_match可以指定多字段進(jìn)行模糊查詢俐镐。

POST /content/_search
{
  "query": {
    "multi_match": {
      "query": "V123456",
        "fields": [
            "data.keyword", "aid"
        ]
      }
  }
}
  • match_phrase_prefix查詢

match_phrase_prefix相當(dāng)于是結(jié)合了match_bool_prefix和match_phrase矫限。ES會先解析檢索詞,分成很多個token佩抹,然后除去最后一個token叼风,對其他的token進(jìn)行match_phrase的匹配,即全部都要匹配并且相對位置相同棍苹;對于最后一個token无宿,需要進(jìn)行前綴匹配并且匹配的這個單詞在前面的match_phrase匹配的結(jié)果的后面。

POST /content/_search
{
 "query": {
   "match_phrase_prefix": {
      "data.keyword": {
        "query": "紅色 連"
      }
    }
 }
}

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-match-query-phrase-prefix.html

  • query_string查詢

query_string:和match類似枢里,但是match需要指定字段名孽鸡,query_string是在所有字段中搜索,范圍更廣泛(當(dāng)然query_string也支持指定字段查詢)栏豺。

POST /content/_search
{
  "query": {
    "query_string": {
      "query": "占某某"
    }
  }
}

3.2.2彬碱、復(fù)合查詢

  • bool多條件查詢

    bool查詢就是由一個或多個bool子句組成復(fù)合查詢,由上述term奥洼、match等組合而成巷疼。

    有以下幾種組合類型:

    Occur Description
    must 相對于條件and,必須同時滿足多條件
    filter 子句(查詢)必須出現(xiàn)在匹配的文檔中灵奖。
    但是嚼沿,與查詢分?jǐn)?shù)不同的是,忽略該分?jǐn)?shù)瓷患。
    Filter子句在過濾器上下文中執(zhí)行骡尽,這意味著計分被忽略,
    并且子句被視為用于緩存擅编。
    (對于我們查詢不需要按評分排序的場景攀细,一般都用filter,效率更高)
    should 相當(dāng)于條件or沙咏,只要有一個或部分條件滿足
    must_not 非辨图,不滿足條件
    POST /content/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "aid":"V123456"
              }
            },
            {
              "term": {
                "data.keyword":"占某某"
              }
            }
          ]
        }
      }
    }
    
    POST /content/_search
    {
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "aid":"V123456"
              }
            },
            {
              "term": {
                "data.keyword":"占某某"
              }
            }
          ]
        }
      }
    }
    

    https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-bool-query.html

  • boosting查詢

    boosting 查詢可以用來有效地降級能匹配給定查詢的結(jié)果。 與 bool 查詢中的“not”子句不同肢藐,這仍然會選擇包含非預(yù)期條款的文檔故河,但會降低其總分。

  • constant score查詢

    此查詢可對另一個查詢進(jìn)行包裝吆豹,并簡單地返回一個與該過濾器中每個文檔的查詢提升相等的常量分?jǐn)?shù)

  • disjunction max查詢

    此查詢生成由其子查詢生成的文檔的并集鱼的,并為每個文檔分配由任意子查詢生成的該文檔的最大分?jǐn)?shù)理盆,以及任何其他匹配子查詢的分?jǐn)?shù)增量即 tie breaking 屬性。

  • function score查詢

    function_score 允許你修改一個查詢檢索文檔的分?jǐn)?shù)凑阶。

3.2.3猿规、術(shù)語查詢

  • exists非空值查詢

查詢原始字段中為非空值的文檔。

null宙橱、[]姨俩、[null]以及指定字段完全丟失的情況,均為空值文檔师郑。對于""空字符串环葵,不屬于空值。

POST /content/_search
{
  "query": {
    "exists": {
      "field": "aid"
    }
  }
}

反過來查詢空值文檔宝冕,可以結(jié)合must_not使用:

POST /content/_search
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "aid"
        }
      }
    }
  }
}
  • fuzzy模糊查詢

查詢相似的文檔张遭。fuzzy搜索會對輸入的搜索文本進(jìn)行糾錯,再進(jìn)行搜索地梨。fuzzy與term類似菊卷,是包含關(guān)系,并且不會對輸入進(jìn)行分詞宝剖。Elasticsearch使用Levenshtein edit distance來測量相似性或模糊性洁闰。

編輯距離是將一個術(shù)語轉(zhuǎn)換為另一個術(shù)語所需的單字符更改數(shù)。這些變化可包括:

  • Changing a character (box → fox)
  • Removing a character (black → lack)
  • Inserting a character (sic → sick)
  • Transposing two adjacent characters (act → cat)

例如诈闺,模糊查詢sic:

POST /content/_search
{
  "query": {
    "fuzzy": {
      "data.keyword": {
        "value": "sic"
        }
      }
  }
}
  • ids查詢

查詢指定id列表的文檔渴庆。

POST /content/_search
{
    "query": {
        "ids" : {
            "values" : ["11", "22"]
        }
    }
}
  • prefix前綴查詢

根據(jù)指定的前綴進(jìn)行查詢。

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-prefix-query.html

  • range范圍查詢

根據(jù)取值范圍進(jìn)行查詢

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-range-query.html

  • regexp正則表達(dá)式查詢

根據(jù)正則表達(dá)式匹配查詢

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-regexp-query.html

  • term值匹配查詢

term:精確查詢雅镊,不會對輸入做分詞襟雷,如果輸入的是"占某某",則直接查詢"占某某"仁烹,如果輸入的是"紅色占某某"耸弄,則直接查詢"紅色占某某"。同時要明確term是包含操作卓缰,而不是等值计呈。

POST /content/_search
{
  "from": 0,
  "size": 20,
  "query": {
    "term": {
      "data.keyword": "紅色占某某"
    }
  }
}

當(dāng)查找一個精確值的時候,我們不希望對查詢進(jìn)行評分計算征唬。只希望對文檔進(jìn)行包括或排除的計算捌显,所以我們會使用 constant_score 查詢以非評分模式來執(zhí)行 term 查詢并以一作為統(tǒng)一評分。constant_score查詢?yōu)樵撨^濾器匹配的所有文檔分配1.0的分?jǐn)?shù)

POST /content/_search
{
 "from": 0,
 "size": 20,
 "query": {
   "constant_score": {
     "filter": {
       "term": {
         "data.keyword": "占某某"
       }
     }
   }
 }
}
  • terms多字段值匹配查詢

terms類似term查詢总寒,terms支持多個值查詢扶歪,是或的關(guān)系。

 POST /content/_search
 {
  "from": 0,
  "size": 20,
  "query": {
    "terms": {
      "data.keyword": ["占某某","紅色占某某"]
    }
  }
 }
  • terms set查詢

terms_set 支持文檔級匹配查詢限制摄闸,terms_set 與terms query語句很類似善镰,區(qū)別在于terms_set 可以做到細(xì)粒度查詢控制妹萨,每個文檔中可以指定一個數(shù)值類型的字段用來控制匹配的term數(shù)。

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-terms-set-query.html

  • wildcard通配符查詢

支持的通配符:

  • ? 匹配任何單個字符
  • * 匹配0個或者多個字符
POST /content/_search
{
  "query": {
    "wildcard": {
      "data.keyword": {
        "value": "紅色*"
      }
    }
  }
}

四炫欺、ES進(jìn)階操作

4.1乎完、腳本

ES API腳本語法格式如下:

"script": {
"lang":   "...",  --> 1
"source" | "id": "...",  --> 2 
"params": { ... }   --> 3
}
1. lang: 編寫腳本所用的語言,默認(rèn)為`painless`
2. source,id: 腳本本身品洛,可以指定為內(nèi)聯(lián)腳本的源树姨,也可以指定為存儲腳本的ID
3. params: 傳給腳本參數(shù)

4.1.1、訪問文檔字段和特殊變量

  • 更新腳本

    在update毫别、update-by-query或reindex API中使用的腳本能夠訪問ctx以下變量:

    變量 描述
    ctx._source 訪問文檔_source字段
    ctx.op 文檔操作項: index or delete
    ctx._index etc 訪問文檔元字段(meta fields)娃弓,有些可能是只讀屬性的

    例如,update_by_query通過腳本更新文檔的time:

    POST /content/_update_by_query
    {
      "query": {
        "term": {
          "aid": "V123456"
        }
      },
      "script" : {
        "source": "ctx._source.time= params.time",
        "lang": "painless",
        "params" : {
          "time" : "2020-12-08 16:00:00"
        }
      }
    }
    

    再舉例岛宦,通過腳本,刪除aid="000001"并且time<="2020-12-07 16:00:00"的文檔:

    POST /content/_update_by_query
    {
        "query": {
        "bool": { 
          "must": [{
              "term": {
                "aid": "000001"
              }
            },
            {
              "range": {
                "time": {
                  "lte": "2020-12-07 16:00:00"
                }
              }
            }]
        }
      },
      "script" : {
        "source": "ctx.op = 'delete'",
        "lang": "painless",
        "params" : {}
      }
    }
    
  • 搜索和聚合腳本

    可以通過腳本使用doc-values耍缴、stored字段或_source字段訪問以下這些字段值:

    • 訪問score
    • 訪問doc values
    • 訪問stored字段和_source

    TODO

4.1.2砾肺、腳本語言介紹

  • painless scripting language

painless是專門設(shè)計給ES使用的,是ES默認(rèn)使用的腳本語言防嗡。

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/modules-scripting-painless.html#modules-scripting-painless

  • lucene expressions language

Lucene的表達(dá)式將JavaScript表達(dá)式編譯為字節(jié)碼变汪。它們設(shè)計用于高性能的自定義排名和排序功能,并且默認(rèn)情況下啟用內(nèi)聯(lián)和存儲腳本蚁趁。

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/modules-scripting-expression.html

  • 使用腳本引擎實現(xiàn)高級腳本

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/modules-scripting-engine.html

4.2裙盾、折疊查詢

使用折疊參數(shù)根據(jù)字段值折疊搜索結(jié)果。也就是我們通常理解的按特定字段進(jìn)行合并去重他嫡。

  • 字段折疊

    使用collapse折疊查詢結(jié)果番官。如下獲取索引aid折疊(去重)的結(jié)果:

    GET /content/_search
    {
      "query": {
        "match_all": {}
      },
      "collapse":{
        "field":"aid"
      },
      "_source": ["aid","type"]
    }
    
  • 展開折疊結(jié)果

    使用inner_hits 參數(shù)展開折疊的結(jié)果。如下獲取索引aid折疊后的钢属,并展開折疊后的按照createDate排序后的前兩條數(shù)據(jù):

    GET /content/_search
    {
      "query": {
        "match_all": {}
      },
      "collapse":{
        "field":"aid",
        "inner_hits":{
          "name":"top_two_rated",
          "size":2,
          "sort":[{
            "createDate":"desc"
          }]
        }
      },
      "_source": ["aid","type"]
    }
    
  • 二級折疊

    注意二級折疊里面不允許使用inner_hits

    GET /idx_agcontent_*/_search
    {
      "query": {
        "match_all": {}
      },
      "collapse":{
        "field":"type",
        "inner_hits":{
          "name":"top_two_rated",
          "collapse":{
            "field":"aid"
          },
          "size":3
        }
      },
      "_source": ["aid","type"]
    }
    

4.3徘熔、聚合操作

4.3.1、度量聚合

度量聚合以某種方式從正在聚合的文檔中提取的值來計算度量淆党。這些值通常從文檔的字段中提瓤崾Α(使用字段數(shù)據(jù)),但也可以使用腳本生成染乌。大多數(shù)度量是簡單的數(shù)學(xué)運(yùn)算(例如最小值山孔、平均值、最大值荷憋,還有匯總)台颠,這些是通過文檔的值來計算的。

  • 值計數(shù)聚合(Value Count Aggregation)

統(tǒng)計某個字段值的個數(shù)台谊,value_count不會去重值蓉媳,因此即使字段具有重復(fù)值(或者腳本為單個文檔生成多個相同的值)譬挚,每個值都會單獨(dú)計算。

例如酪呻,統(tǒng)計指定字段aid總數(shù)(不包含aid為null的數(shù)據(jù)):

POST /content/_search
{
  "aggs": {
    "aid_count": {
      "value_count": {
        "field": "aid"
      }
    }
  },
  "size": 0
}

如下减宣,用painless 腳本語言將 script 參數(shù)解釋為內(nèi)聯(lián)腳本進(jìn)行值統(tǒng)計。

POST /content/_search
{
  "aggs": {
    "aid_count": {
      "value_count": {
        "script": {
          "source": "doc['aid']"
        }
      }
    }
  },
  "size": 0
}

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/search-aggregations-metrics-valuecount-aggregation.html

  • 基數(shù)聚合(Cardinality Aggregation)

用于計算不同值的近似計數(shù)玩荠。值可以從文檔中的特定字段中提取漆腌,也可以由腳本生成。

例如阶冈,統(tǒng)計指定字段aid去重后總數(shù)(不包含aid為null的數(shù)據(jù)):

POST /content/_search
{
  "aggs": {
    "aid_count": {
      "cardinality": {
        "field": "aid"
      }
    }
  },
  "size": 0
}

同時這種聚合操作支持precision_threshold參數(shù)選項闷尿,precision_threshold選項允許用內(nèi)存交換精度,并定義一個唯一計數(shù)女坑,低于此計數(shù)的計數(shù)值將接近精確填具。超過這個值,計數(shù)可能會變得模糊一些匆骗。支持的最大值為40000劳景,高于此數(shù)的閾值將與閾值40000的效果相同。默認(rèn)值為3000碉就。

基數(shù)聚合是基于hyperloglog++算法實現(xiàn)的盟广。

  • 均值聚合(Avg Aggregation)

統(tǒng)計均值

  • 最大值聚合(Max Aggregation)

統(tǒng)計最大值

  • 最小值聚合(Min Aggregation)

統(tǒng)計最小值

其他相關(guān)聚合不再一一介紹,詳情查看官網(wǎng)文檔瓮钥。

4.3.2筋量、桶聚合

桶聚合不像度量聚合那樣計算字段上的度量,而是創(chuàng)建文檔桶碉熄。桶可以理解為是滿足特定條件文檔的集合桨武。

  • 術(shù)語聚合(Terms Aggregation)

根據(jù)字段值項分組聚合。

例如具被,獲取aid值聚合玻募,并根據(jù)計數(shù)進(jìn)行降序排序:

POST /content/_search
{
 "aggs": {
   "aid_value": {
     "terms": {
       "field": "aid",
       "order": {
         "_count": "desc"
       }, 
       "size": 3
     }
   }
 },
 "size": 0
}

? 術(shù)語聚合不支持一個文檔中多字段聚合。原因在于術(shù)語聚合本身并不收集字符串值一姿,而是使用全局序數(shù)(global ordinals)來生成字段中所有唯一值的列表七咧。全局順序?qū)е乱粋€重要的性能提升,這導(dǎo)致不可能跨多個字段叮叹。

? 有以下兩種方法可用于跨多個字段執(zhí)行術(shù)語聚合:

? Script:

? 使用腳本從多字段檢索術(shù)語艾栋。這會將全局序數(shù)優(yōu)化,并且這個比從單個字段收集術(shù)語要慢蛉顽,但是可以更加靈活的實現(xiàn)相關(guān)搜索蝗砾。

? copy_to field:

? 如果提前知道要從兩個或多個字段收集術(shù)語,那么在映射中使用copy_to在索引時創(chuàng)建一個新的專用字段,其中包含兩個字段的值悼粮∠猩祝可以在此單個字段上聚合,這將受益于全局序數(shù)優(yōu)化扣猫。

如下菜循,使用腳本,獲取aid+type唯一值的聚合:

POST /content/_search
{
  "aggs": {
      "app_count": {
          "terms": {
              "script": {
                  "inline": "doc['aid'].value +'-split-'+ doc['type'].value"
              },
              "order": {
                  "_count": "desc"
              },
              "size": 1000
          }
      }
  },
  "size": 0
}

? 術(shù)語聚合可以包含子聚合申尤,例如:

POST /content/_search
{
 "aggs": {
   "type_value": {
     "terms": {
       "field": "type",
       "order": {
         "_count": "desc"
       }
     },
     "aggs": {
       "aid_value": {
         "terms": {
           "field": "aid",
           "size": 5
         }
       }
     }
   }
 },
 "size": 0
}

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/search-aggregations-bucket-terms-aggregation.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末癌幕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昧穿,更是在濱河造成了極大的恐慌勺远,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件时鸵,死亡現(xiàn)場離奇詭異胶逢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寥枝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門宪塔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人囊拜,你說我怎么就攤上這事”却睿” “怎么了冠跷?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長身诺。 經(jīng)常有香客問我蜜托,道長,這世上最難降的妖魔是什么霉赡? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任橄务,我火速辦了婚禮,結(jié)果婚禮上穴亏,老公的妹妹穿的比我還像新娘蜂挪。我一直安慰自己,他們只是感情好嗓化,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布棠涮。 她就那樣靜靜地躺著,像睡著了一般刺覆。 火紅的嫁衣襯著肌膚如雪严肪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音驳糯,去河邊找鬼篇梭。 笑死,一個胖子當(dāng)著我的面吹牛酝枢,可吹牛的內(nèi)容都是我干的恬偷。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼隧枫,長吁一口氣:“原來是場噩夢啊……” “哼喉磁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起官脓,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤协怒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卑笨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孕暇,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年赤兴,在試婚紗的時候發(fā)現(xiàn)自己被綠了妖滔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡桶良,死狀恐怖座舍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陨帆,我是刑警寧澤曲秉,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站疲牵,受9級特大地震影響承二,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纲爸,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一亥鸠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧识啦,春花似錦负蚊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至题翻,卻和暖如春揩徊,著一層夾襖步出監(jiān)牢的瞬間腰鬼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工塑荒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留熄赡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓齿税,卻偏偏與公主長得像彼硫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凌箕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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