一砂蔽、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基本原理
2.1衷戈、ES架構(gòu)
2.2狭吼、ES索引
索引是為了快速檢索數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu),對于我們熟悉的Mysql殖妇,采用的是B+樹(Innodb引擎)刁笙,而ES采用的是一種倒排索引的數(shù)據(jù)結(jié)構(gòu)。
- 正排索引
是以ID查詢對應(yīng)的數(shù)據(jù)記錄谦趣,是一種key-value的查詢過程疲吸。
倒排索引(Inverted Index)
一個倒排索引由文檔中所有不重復(fù)詞的列表構(gòu)成,對于其中的每個詞蔚润,有一個包含它的文檔列表磅氨。
假如有以下兩個文檔:
- The quick brown fox jumped over the lazy dog
- Quick brown foxes leap over lazy dogs in summer
為了創(chuàng)建倒排索引,先將每個文檔進(jìn)行分詞嫡纠,創(chuàng)建一個包含所有不重復(fù)詞條的排序列表,并列出每個詞出現(xiàn)在哪個文檔中。結(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逞壁、建立索引和搜索過程
建索引:數(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算法。
三俩莽、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
ordelete
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)使用的腳本語言防嗡。
- 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 }
- 基數(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 }