日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理

發(fā)布時(shí)間:2025/3/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 概述
  • 思考
  • 知識(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 doc3

doc2, 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ì)

正排索引 如下:

documentagg_field
doc1agg_fiele_value1
doc2agg_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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。