白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
文章目錄
- 概述
- 思考
- 知識(shí)點(diǎn)
- 舉例說(shuō)明
- 純用倒排索引來(lái)實(shí)現(xiàn)的弊端
- 倒排索引+正排索引(doc value)的原理和優(yōu)勢(shì)
概述
繼續(xù)跟中華石杉老師學(xué)習(xí)ES,第50篇
課程地址: https://www.roncoo.com/view/55
思考
聚合分析的內(nèi)部原理是什么?當(dāng)我們使用比如aggs,term,avg 、max等執(zhí)行一個(gè)聚合操作的時(shí)候,內(nèi)部原理是怎樣的呢?用了什么樣的數(shù)據(jù)結(jié)構(gòu)去執(zhí)行聚合?是不是用的倒排索引?
知識(shí)點(diǎn)
ES搜索靠倒排索引。 排序的時(shí)候,需要依靠正排索引,看到每個(gè)document的每個(gè)field,然后進(jìn)行排序,所謂的正排索引,其實(shí)就是doc values。
ES在建立索引的時(shí)候,
- 一方面會(huì)建立倒排索引,以供搜索用;
- 一方面會(huì)建立正排索引,也就是doc values,以供排序,聚合,過(guò)濾等操作使用。
doc values是被保存在磁盤上的,此時(shí)如果內(nèi)存足夠,os會(huì)自動(dòng)將其緩存在內(nèi)存中,性能還是會(huì)很高,若內(nèi)存不足,os會(huì)將其寫入磁盤。
舉例說(shuō)明
舉一個(gè) 搜索+聚合 的例子 來(lái)理解下 倒排索引和正排索引。
GET /test_index/test_type/_search {"query": {"match": {"search_field": "test"}},"aggs": {"group_by_agg_field": {"terms": {"field": "agg_field"}}} }那上面的DSL舉個(gè)例子
假設(shè)索引中有3個(gè)doc
doc1: hello world test1, test2 doc2: hello test doc3: world test那ES建立的倒排索引如下:
hello ---> doc1,doc2 world ---> doc1,doc3 test1 ---> doc1 test2 ---> doc1 test ---> doc2,doc3我們的DSL中的查詢
"query": {"match": {"search_field": "test"}}查詢 “test” ,那么直接從倒排索引中查到對(duì)應(yīng)的結(jié)果為doc2,doc3 ,那么搜索就是 doc2,doc3 。
純用倒排索引來(lái)實(shí)現(xiàn)的弊端
先回歸下,最簡(jiǎn)單的aggs操作
請(qǐng)求DSL中, "field": "color" ,按照某個(gè)字段劃分bucket操作,
返回結(jié)果是 該field對(duì)應(yīng)的value ,每個(gè)value對(duì)應(yīng)一個(gè)bucket .
那我們上面的例子中的 aggs呢 ? 假設(shè)也是 倒排索引的方式來(lái)查找,我們來(lái)分析下
agg_field
假設(shè)如下N多個(gè)doc:
... ... ... ...N多doc doc2: agg_field_value_1 doc3: agg_field_value_2那建立的倒排索引 如下
... ... ... ... ...N多值 agg_field_value_1 doc2 agg_field_value_2 doc3doc2, doc3, search result --> 實(shí)際上,要搜索到doc2的agg_field的值是多少,doc3的agg_field的值是多少
拿到doc2和doc3的agg_field的值之后,就可以根據(jù)值進(jìn)行分組,實(shí)現(xiàn)terms bucket操作
doc2的agg_field的值是多少,這個(gè)時(shí)候,如果你手上只有一個(gè)倒排索引,你該怎么辦???你要掃描整個(gè)倒排索引,去一個(gè)一個(gè)的搜,拿到每個(gè)值,比如說(shuō)agg_field_value_1 ,看一下,它是不是doc2的值,拿到agg_field_value_2,看一下,是不是doc2的值,直到在倒排索引中找到doc2的agg_field的值。
如果用純倒排索引去實(shí)現(xiàn)聚合,現(xiàn)實(shí)不現(xiàn)實(shí)啊???性能是很低下的。。。搜索,search,搜倒排索引,搜那個(gè)term,就結(jié)束了。。。聚合,搜索出了1萬(wàn)個(gè)doc,每個(gè)doc都要在倒排索引中搜索出它的那個(gè)聚合field的值。
倒排索引的話,必須遍歷完整個(gè)倒排索引才可以。。。。
因?yàn)榭赡苣阋酆系哪莻€(gè)field的值,是分詞的,比如說(shuō)hello world my name --> 一個(gè)doc的聚合field的值可能在倒排索引中對(duì)應(yīng)多個(gè)value
所以說(shuō),當(dāng)你在倒排索引中找到一個(gè)值,發(fā)現(xiàn)它是屬于某個(gè)doc的時(shí)候,還不能停,必須遍歷完整個(gè)倒排索引,才能說(shuō)確保找到了每個(gè)doc對(duì)應(yīng)的所有terms,然后進(jìn)行分組聚合
倒排索引+正排索引(doc value)的原理和優(yōu)勢(shì)
正排索引 如下:
| doc1 | agg_fiele_value1 |
| doc2 | agg_fiele_value2 |
1萬(wàn)個(gè)doc --> 搜 -> 可能跟搜索到15000次,就搜索完了,就找到了1萬(wàn)個(gè)doc的聚合field的所有值了,然后就可以執(zhí)行分組聚合操作了
石杉老師說(shuō)的最后一句話 ,我沒(méi)明白, 為啥不用把正排索引都搜索完呢? 有明白的同仁 指導(dǎo)下 拜托了。
總結(jié)
以上是生活随笔為你收集整理的白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 白话Elasticsearch49-深入
- 下一篇: 白话Elasticsearch50-深入