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