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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理

發(fā)布時間:2025/3/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 概述
  • 官網
  • 示例
    • 對于分詞的field執(zhí)行aggregation,報錯
    • 給分詞的field,設置fielddata=true,可執(zhí)行
    • 使用field.keyword,對分詞的field進行聚合,可執(zhí)行
  • 分詞field+fielddata的工作原理


概述

繼續(xù)跟中華石杉老師學習ES,第51篇

課程地址: https://www.roncoo.com/view/55


官網

fielddata: 戳這里



示例

對于分詞的field執(zhí)行aggregation,報錯

先構造下模擬索引及數據

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類型,默認是分詞的,那么我們對該字段進行 aggs看下

GET /artisan_index/artisan_type/_search {"size": 0,"aggs": {"group_by_artisan_field": {"terms": {"field": "artisan_filed"}}} }

報錯如下:

{"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."}

對分詞的field,直接執(zhí)行聚合操作,會報錯,大概意思是說,你必須要打開fielddata,然后將正排索引數據加載到內存中,才可以對分詞的field執(zhí)行聚合操作,而且會消耗很大的內存 .

當然了,排序這種操作也是不行的。


給分詞的field,設置fielddata=true,可執(zhí)行

#刪除索引 DELETE artisan_index#創(chuàng)建索引,設置text類型的字段的fielddata為true PUT /artisan_index {"mappings": {"artisan_type": {"properties": {"artisan_filed": {"type": "text","fielddata": true}}}} }#模擬數據 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"}}} }

如果要對分詞的field執(zhí)行聚合操作,必須將fielddata設置為true


使用field.keyword,對分詞的field進行聚合,可執(zhí)行

#直接寫入數據,讓ES自動創(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內置的keyword也可以在沒設置fielddata=true的情況下聚合 GET /artisan_index/artisan_type/_search {"size": 0,"aggs": {"group_by_artisan_field": {"terms": {"field": "artisan_filed.keyword"}}} }

artisan_filed.keyword es內置的keyword也可以在沒設置fielddata=true的情況下。

當然了,如果對不分詞的field執(zhí)行聚合操作,直接就可以執(zhí)行,不需要設置fieldata=true


分詞field+fielddata的工作原理

doc value --> 不分詞的所有field,可以執(zhí)行聚合操作 --> 如果你的某個field不分詞,那么在index-time,就會自動生成doc value --> 針對這些不分詞的field執(zhí)行聚合操作的時候,自動就會用doc value來執(zhí)行。

分詞field,是沒有doc value的。。。在index-time,如果某個field是分詞的,那么是不會給它建立doc value正排索引的,因為分詞后,占用的空間過于大,所以默認是不支持分詞field進行聚合的

分詞field默認沒有doc value,所以直接對分詞field執(zhí)行聚合操作,是會報錯的

對于分詞field,必須打開和使用fielddata,完全存在于純內存中。。。結構和doc value類似。。。如果是ngram或者是大量term,那么必將占用大量的內存。。。

如果一定要對分詞的field執(zhí)行聚合,那么必須將fielddata=true,然后es就會在執(zhí)行聚合操作的時候,現場將field對應的數據,建立一份fielddata正排索引,fielddata正排索引的結構跟doc value是類似的,但是只會將fielddata正排索引加載到內存中來,然后基于內存中的fielddata正排索引執(zhí)行分詞field的聚合操作

如果直接對分詞field執(zhí)行聚合,報錯,提示讓我們開啟fielddata=true,告訴我們,會將fielddata uninverted index(正排索引),加載到內存,會耗費內存空間

為什么fielddata必須在內存?分詞的字符串,需要按照term進行聚合,需要執(zhí)行更加復雜的算法和操作,如果基于磁盤和os cache,那么性能會很差

總結

以上是生活随笔為你收集整理的白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。