白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理
文章目錄
- 概述
- 官網(wǎng)
- 示例
- 對(duì)于分詞的field執(zhí)行aggregation,報(bào)錯(cuò)
- 給分詞的field,設(shè)置fielddata=true,可執(zhí)行
- 使用field.keyword,對(duì)分詞的field進(jìn)行聚合,可執(zhí)行
- 分詞field+fielddata的工作原理
概述
繼續(xù)跟中華石杉老師學(xué)習(xí)ES,第51篇
課程地址: https://www.roncoo.com/view/55
官網(wǎng)
fielddata: 戳這里
示例
對(duì)于分詞的field執(zhí)行aggregation,報(bào)錯(cuò)
先構(gòu)造下模擬索引及數(shù)據(jù)
PUT /artisan_index {"mappings": {"artisan_type": {"properties": {"artisan_filed": {"type": "text"}}}} }PUT /artisan_index/artisan_type/1 {"artisan_filed": "artisan_1" }PUT /artisan_index/artisan_type/2 {"artisan_filed": "artisan_2" } GET /artisan_index/_mapping/artisan_type我們建立的 artisan_filed是text類型,默認(rèn)是分詞的,那么我們對(duì)該字段進(jìn)行 aggs看下
GET /artisan_index/artisan_type/_search {"size": 0,"aggs": {"group_by_artisan_field": {"terms": {"field": "artisan_filed"}}} }報(bào)錯(cuò)如下:
{"type": "illegal_argument_exception","reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [artisan_filed] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."}對(duì)分詞的field,直接執(zhí)行聚合操作,會(huì)報(bào)錯(cuò),大概意思是說(shuō),你必須要打開(kāi)fielddata,然后將正排索引數(shù)據(jù)加載到內(nèi)存中,才可以對(duì)分詞的field執(zhí)行聚合操作,而且會(huì)消耗很大的內(nèi)存 .
當(dāng)然了,排序這種操作也是不行的。
給分詞的field,設(shè)置fielddata=true,可執(zhí)行
#刪除索引 DELETE artisan_index#創(chuàng)建索引,設(shè)置text類型的字段的fielddata為true PUT /artisan_index {"mappings": {"artisan_type": {"properties": {"artisan_filed": {"type": "text","fielddata": true}}}} }#模擬數(shù)據(jù) PUT /artisan_index/artisan_type/1 {"artisan_filed": "artisan_1" }PUT /artisan_index/artisan_type/2 {"artisan_filed": "artisan_2" }#查看映射 GET /artisan_index/_mapping/artisan_type--------------- # 聚合操作 GET /artisan_index/artisan_type/_search {"size": 0,"aggs": {"group_by_artisan_field": {"terms": {"field": "artisan_filed"}}} }如果要對(duì)分詞的field執(zhí)行聚合操作,必須將fielddata設(shè)置為true
使用field.keyword,對(duì)分詞的field進(jìn)行聚合,可執(zhí)行
#直接寫入數(shù)據(jù),讓ES自動(dòng)創(chuàng)建索引 PUT /artisan_index/artisan_type/1 {"artisan_filed": "artisan_1" }PUT /artisan_index/artisan_type/2 {"artisan_filed": "artisan_2" }#查看映射 GET /artisan_index/_mapping/artisan_type # artisan_filed.keyword es內(nèi)置的keyword也可以在沒(méi)設(shè)置fielddata=true的情況下聚合 GET /artisan_index/artisan_type/_search {"size": 0,"aggs": {"group_by_artisan_field": {"terms": {"field": "artisan_filed.keyword"}}} }artisan_filed.keyword es內(nèi)置的keyword也可以在沒(méi)設(shè)置fielddata=true的情況下。
當(dāng)然了,如果對(duì)不分詞的field執(zhí)行聚合操作,直接就可以執(zhí)行,不需要設(shè)置fieldata=true
分詞field+fielddata的工作原理
doc value --> 不分詞的所有field,可以執(zhí)行聚合操作 --> 如果你的某個(gè)field不分詞,那么在index-time,就會(huì)自動(dòng)生成doc value --> 針對(duì)這些不分詞的field執(zhí)行聚合操作的時(shí)候,自動(dòng)就會(huì)用doc value來(lái)執(zhí)行。
分詞field,是沒(méi)有doc value的。。。在index-time,如果某個(gè)field是分詞的,那么是不會(huì)給它建立doc value正排索引的,因?yàn)榉衷~后,占用的空間過(guò)于大,所以默認(rèn)是不支持分詞field進(jìn)行聚合的
分詞field默認(rèn)沒(méi)有doc value,所以直接對(duì)分詞field執(zhí)行聚合操作,是會(huì)報(bào)錯(cuò)的
對(duì)于分詞field,必須打開(kāi)和使用fielddata,完全存在于純內(nèi)存中。。。結(jié)構(gòu)和doc value類似。。。如果是ngram或者是大量term,那么必將占用大量的內(nèi)存。。。
如果一定要對(duì)分詞的field執(zhí)行聚合,那么必須將fielddata=true,然后es就會(huì)在執(zhí)行聚合操作的時(shí)候,現(xiàn)場(chǎng)將field對(duì)應(yīng)的數(shù)據(jù),建立一份fielddata正排索引,fielddata正排索引的結(jié)構(gòu)跟doc value是類似的,但是只會(huì)將fielddata正排索引加載到內(nèi)存中來(lái),然后基于內(nèi)存中的fielddata正排索引執(zhí)行分詞field的聚合操作
如果直接對(duì)分詞field執(zhí)行聚合,報(bào)錯(cuò),提示讓我們開(kāi)啟fielddata=true,告訴我們,會(huì)將fielddata uninverted index(正排索引),加載到內(nèi)存,會(huì)耗費(fèi)內(nèi)存空間
為什么fielddata必須在內(nèi)存?分詞的字符串,需要按照term進(jìn)行聚合,需要執(zhí)行更加復(fù)雜的算法和操作,如果基于磁盤和os cache,那么性能會(huì)很差
總結(jié)
以上是生活随笔為你收集整理的白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 白话Elasticsearch50-深入
- 下一篇: 白话Elasticsearch52-深入