解析ElasticSearch ElasticSearch字段類型解析
ElasticSearch
一、字段的類型Field type的詳解
(資料圖片僅供參考)
下面就是所有的字段類型
字符串類型text,keyword整數類型integer,long,short,byte浮點類型double,float,half_float,scaled_float邏輯類型boolean日期類型date范圍類型range二進制類型binary復合類型數組類型array對象類型object嵌套類型nested地理類型地理坐標類型geo_point地理地圖geo_shape特殊類型IP類型ip范圍類型completion令牌計數類型token_count附件類型attachment抽取類型percolator
1、字符串類型
1.1、text
會被分詞器解析, 生成倒排索引, 支持模糊、精確查詢, 不用于排序, 很少用于聚合,常用于全文檢索.
1.2、keyword
不進行分詞,直接索引, 支持模糊、精確查詢, 支持聚合。如果需要為結構化內容, 比如 id、email、hostnames、狀態碼、標簽等進行索引,則推薦使用 keyword類型以進行完全匹配. 比如我們需要查詢"已發貨"的訂單, 標記為"已發布"的文章等.
ES會對"數值(numeric)"類型的字段(比如, integer, long)進行優化以支持范圍(range)查詢. 但是, 不是所有的數值類型的數據都需要使用"數值"類型, 比如產品id, 會員id, ISDN(出版社編號), 這些很少會被進行范圍查詢, 通常都是精確匹配(term query).
keyword類型的查詢通常比numeric的要快, 如果不需要范圍查詢, 則建議使用keyword類型.
如果不確定使用哪一種, 可以通過multi-field同時設置keyword和numeric類型.
2、數值類型(numeric)
類型說明取值范圍
byte8位有符號整數-128 ~ 127
short16位有符號整數-32768 ~ 32767
integer32位有符號整數-2,147,483,648 ~ 2,147,483,647 即:-2^31 ~ 2^32 - 1
long64位有符號整數-2^63 ~ 2^63 - 1
float32位單精度IEEE 754浮點類型, 有限值, 24bits2^-149 ~ (2 - 2^-23) · 2^127
double64位雙精度IEEE 754浮點類型, 有限值, 53bits2^-1074 ~ (2 - 2^-52) · 2^1023
half_float16位半精度IEEE 754浮點類型, 有限值, 11bits2^-24 ~ 65504
scaled_float帶有縮放因子scaling_factor的浮點數, 可以當整型看待
2.1、整型
byte, short, integer, long
2.2、浮點型
float, half_float, scaled_float, double 對于上面展示的3種浮點類型(float, half_float, scaled_float)來說, -0.00和+0.00是不同的值,使用term查詢-0.00時不會匹配+0.00, 反之亦然。對于范圍查詢(range query)來說也是如此:如果上邊界是-0.00則無法匹配+0.00,如果下邊界是+0.00則不會匹配-0.00
數值類型使用的注意事項:
在滿足業務需求的情況下, 盡量選擇范圍小的類型, 這與mysql等關系型數據庫的設計要求是一致的. 字段占用的空間越小, 搜索和索引的效率越高(這個有點廢話, 數據量越小肯定越快了).
如果是浮點數, 則也要優先考慮使用scaled_float類型。對于scaled_float類型, 在索引時會乘以scaling_factor并四舍五入到最接近的一個long類型的值.
如果我們存儲商品價格只需要精確到分, 兩位小數點, 把縮放因子設置為100, 那么浮點價格99.99存儲的是9999.
如果我們要存儲的值是2.34, 而因子是10, 那么會存儲為23, 在查詢/聚合/排序時會表現為這個值是2.3. 如果設置更大的因子(比如100), 可以提高精度, 但是會增加空間需求.
3、Object類型
JSON文檔天生具有層級關系: 文檔可能包含內部對象, 而這個對象可能本身又包含對象, 就是可以包含嵌套的對象.
4、Date
JSON沒有日期(date)類型, 在ES中date類型可以表現為:
字符串格式的日期, 比如: “2015-01-01”, “2015/01/01 12:10:30”long類型的自 epoch (1970-1-1) 以來的毫秒數integer類型的自 epoch (1970-1-1) 以來的秒數(時間戳, timestamp)
在ES內部, 日期被轉換為UTC格式(如果指定了時區), 并存儲為long類型的自 epoch (1970-1-1) 以來的毫秒數.
查詢時 , date類型會在內部轉換為long類型的范圍查詢,聚合和存儲字段的結果根據與字段關聯的日期格式轉換回字符串。
5、ip類型
ip類型的字段只能存儲ipv4或ipv6地址.
二、屬性的詳解
1、fielddata字段數據
參考鏈接:https://www.cnblogs.com/rickie/p/11665168.html
默認情況下是false
作用:把不能聚合、排序、通過腳本訪問的字段變為可以聚合、排序、通過腳本訪問的字段
text類型是不支持doc_value。所以要想對text類型的字段擁有聚合等功能,只能設置屬性的fielddata為true即可
缺點:構建和管理全部在內存,也就是在JVM的內存中。這意味著它本質上是不可擴展的。
fielddata可能會消耗大量的堆空間,尤其是在加載高基數(high cardinality)text字段時。一旦fielddata已加載到堆中,它將在該段的生命周期內保留。此外,加載fielddata是一個昂貴的過程,可能會導致用戶遇到延遲命中。這就是默認情況下禁用fielddata的原因。
如果需要對 text 類型字段進行排序、聚合、或者從腳本中訪問字段值,則會出現如下異常:
Fielddata is disabled on text fields by default. Set fielddata=true on [your_field_name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.
但是,在啟動fielddata 設置之前,需要考慮為什么針對text 類型字段進行排序、聚合、或腳本呢?通常情況下,這是不太合理的。
text字段在索引時,例如New York,這樣的詞會被分詞,會被拆成new、york 2個詞項,這樣當搜索new 或 york時,可以被搜索到。在此字段上面來一個terms的聚合會返回一個new的bucket和一個york的bucket,但是你可能想要的是一個單一new york的bucket。
怎么解決這一問題呢?
你可以使用 text 字段來實現全文本查詢,同時使用一個未分詞的 keyword 字段,且啟用doc_values,來處理聚合操作。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qlza4utS-1644556258944)(data:image/png;base64,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)]
(1) 使用my_field 字段用于查詢;
(2) 使用my_field.keyword 字段用于聚合、排序、或腳本; 注意:但是我試了試,不行,我也不知道為啥
PUT /user3{"mappings": {"properties": {"name":{"type": "text", "fields": {"keyword":{"type":"keyword" } } } } }}POST /user3/_doc{"name":"hello word 的數據結構 你真棒"}GET /user3/_search{"query": {"match": {"name": "hello" } }, "aggs":{"testq":{"terms":{"field":"name.keyword" } } }}結果輸出:{"took" : 1, "timed_out" : false, "_shards" : {"total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : {"total" : {"value" : 1, "relation" : "eq" }, "max_score" : 0.2876821, "hits" : [ {"_index" : "user3", "_type" : "_doc", "_id" : "N_X1n34BgddXgx4111ZC", "_score" : 0.2876821, "_source" : {"name" : "hello word 的數據結構 你真棒" } } ] }, "aggregations" : {"testq" : {"doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ {"key" : "hello word 的數據結構 你真棒", "doc_count" : 1 } ] } }}
也可以使用 PUT mapping API 在現有text 字段上啟用 fielddata,如下所示:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-C0iFF2N6-1644556258949)(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARsAAADxCAYAAAD7hRNxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABDMSURBVHhe7d2xy9zIGcfxS5cuVaor3RgMDhiDa1f5Awz3B1xzTewutYM7YxfmxeSSxgfuXpOzwcFpY3B4CxPewuEcG0wwOAncGdsB82JwM9HMaKSZ0SOtVtI+q119iw+8uxppJe3Mb0ezr2a/OH/hogGATSNsAKggbACoIGwAqCBsAKggbACoIGwAqCBsAKggbACoIGwAqCBsAKggbACoIGwAqCBsAKggbAa69Pij+f6DMXcffysuX98jc1Bs7+BQWjal2+bJ28/mx6PbwrLdcuWZce/B5s8ZpjA8bC6/MF8enmRemLNVmQNz5s6JOXX1IF3vwgNzuih7+nLxt7iN4Cdz5qt4vXnZ2bC5/8qcfHpl7knLdgxhs1tGhk0aCGdvxSHRI2zi59324rBaGp2wufdyP3o12D2Thk0IEh8whM16FMLm5lPz46f35slNYRmwYRsJGx8kemHjLmmePaq61fnf5y98a669Kf5+c2wuJev6Bu7LxM93OHztt1tqhoN/LXt5Ve2D1Xjt+jIglm6v3L/Ka3OlWlYe04eP5tr1ep1weSeF1o2j9+bk5cPG86usPr+hbL6/wr7Z85Ccw7hMv3MXjrG5fhCCO5yjUv4+Xz82d6vtdJTDJDZwGRUCQzlsikrixk9CRbYVxv1dNlD3d1Yx4+Vra+uJ1BW8Hs/xZePxHdeYkkaUb6+5jj/OdH+T7ZTHLgXN+QsPzfNPn83z+9Kybr3OrztuYd+i/a1Don4uPQ9ROFQNvnkeKi4s2sMmORdlsLSf3/K1CZqNmXaA+NaDqIx22JQVOG4AjcbQbPBiJe4lD4dAqrTZa4uNJN2eO6bsE11+zbDt46zxZEYMDPc7v4JsebKdIDkXcoOXz0VhRdik5yI7d8K6ra+DSUx8GRWbW9hkj1sral8jwkZspELYFI8ljdd0x1Isa/1UHvd1d9/zK+9zvjw77nLf/TF1hE2+njUmbBpl5NfGdDYYNuVlVdLbKXx1ZE5J62mETVTh3DqjKlZeeYMeYSM2knR7bv96fcqG9bLXiI0cGO51ft3f2TFl518MjeRcdITN1D2b8nESjATNRm00bKQyLoDuHJlzcTlLJWxCxf3YUknXkVfeoEfYNBpDXfGr7ZWf+GJ4VLLXKtfJ98l+3T1kYDgYFjbhmOrz3wyb/FwJ567lmOplw8KmNcCwMZsNm8K5qz8V5aJxHSloLKWwqRrBwE8xP+gp6GowjbAplI3Ir28bjC+TNKqkTBCOp9mYLX8u4tcaPjAc9Du/5XFX+1kc06Hd/3r/wr7F0kDIt2HlYSKV8eptrQ6b9u2k5xPTGR42OyuvdPvNfd399qm5ISzTloSWqAyAgR8E60i/BQv0Xn+JFhY2S6tM87oPavZhU/Yk0x4RprKQsAmXHO0VufXyqCKNDew48TItM2HDn1PYJHUispQe7zYs8DIKwDYQNgBUEDYAVBA2AFQQNgBUEDYAVBA2AFQQNgBUEDYAVBA2AFRMEzZuvpTP5qTAzP0AJBOEzf786BmAzZkgbOx8Kfw8CIBuhA0AFYQNABXjw2aPfjsawOYMDxsXMuMm0gawHPRsAKhgzAaACsIGgArCBoAKwgaAignCxt+uwLdSALpMEDaW7d1wIyaAdhOFDQB0I2wAqCBsAKggbACoIGwAqCBsAKggbACoIGwAqCBsAKggbACo2H7YXD82dz8Y8/2zR8Xjb821N8Xfb47NJansIj0yB/b8fHhtrojLJ3D4uti+MXcff1s8Ll/PvR9C2amEmR4Lz+8Ly7F3ZtCziSv3ssLm0uOPPY5VIWzKwNcLG38vHSGzLITNFvULGwXaYeN+QZWpZJdmBmHjA8ZX9IvmyrNNf6rOx2zCpgyYg0P7d/p+bARhs0g7MEBcV34XRPZT18oaaRVSYQzIyS49kmXWR3Pter28avzlGIZUpioXbSdvmHWIhEugdDvJcWR8g7fKXl5Y1hZK+TEJ5fL9HX5JVs5dNHayNMJmkXYmbFwjqXo8vhHHjbxuwKEhleuFdcpGWTfm0AjrEKgbZd0Y3XajBuzLxI21uS/1drKAyYLAlWsLkUhrOeGYGq/jgnNouOSmCZsbR+/Nydun5oawDPtrd8Imu7TKG6APm7RRxWWkxh73mqryecN0DTqERny5Ucv3xW8n6xEJjT5fr01bOXdM+SVnsr+FspeW7/M2uJBhgrXF2u2wiRqvHCY1sWFm28636SS9h/iyKNMIm2w7gknCRtoXMejq5dsOHno2y7RfPZuBYTO2Z5NTDZvGMa0wh54OYzaLtJth02esIic0sjwUmiHRfG3fm+gOkr5h4/cp64UIWkNpUHD0C0wZA8QYbrcGiCvNBroybKzsciIPBB8S8fLmN02WD5z2cr3DppBvqwqBMlDjZV73JZITnYe+x9QPYYPhdvYyahPWCQmMQNgsEmETIWy0+NsV+FZqWQibCGGjyPVuuBFzSXYgbADsA8IGgArCBoAKwgaACsIGgArCBoAKwgaACsIGgArCBoAKwgY77fSvvza//PqP5ue//av52dV/OPZv+5xdJq2D7SBssLNsoHzxux862TLSutC3P2FTTrXgp08oZ9RTuJ9qldYpJLLlw+aXyWYO7HW8/l6zZJqJbZy7kT9S94vf/EkMF4ktK20DuvYnbMr5X+YUNn1u7BwXNjW3naFho37uxv1IndyjeWW++ds7893f35mr3+fL6OHMAWGzMUKj3qCdCpsR89nYcZg8SH7153fm+H++l2QdP02XB4zhbNcejdn4RuJ7CLoNXbZDYaN97kaETbNX81/zFxs0Hz+Zf5WB0xY29G62ayEDxL4BHRyWn9quYcV/2zItn+jJp370fBtpms6gdbrOtnmI63302i/JusImfS1vWJhsf1pQ+01TGiL/Md/985355g8/mN//uzts7LrSNqFjUWETGnU8ThI3UmmMxT23am5jUc8eggszKWx80MTrd40BtYVNc50xPZft/0id/WpbChJrVdjYdaVtQseywqZsjHHDTBupb+D1YG3oEYXH6xgXNnLI5ftXk8NGKj8mbMaZ4kfqCJvdRdhkjTRp5O6SqPvbpHYThE0RFJLeYSNue3thE4zp2TQvo2pcRs0bYZM30qiB2mXDG+UEYbPG5ZsYNjPr2VQmHSCurQobBoi3i7ARGql77s3HIgSG9mqscWHjn+8fCnLYpMddPV5ju6ntDxBLX30Hq8KGr763i7CRGumaDV3WFTZ1o88l5cv9SMtEAdj6zVcckr53E5bZXo495l0NG6utd9MVNvRqtm8hYbOmtt4GpjEybCxuV9g9hE2D7wmM69Wg2zQ/Utc1fhPQo5kPwiaILlnkoEkvR0SD/h9noVzvxl/2jPmROjsOYwPFftNkv9q27N/2OcZo5oWwAaCCsAGggrABoIKwAaCCsAGggrABoIKwAaCCsAGggrABoIKwAaCCsEmEu7H9XdN+Aqs535C5a/s7kZn+RlirXdvfDSFsMm7KiVWNd9QMftPqtb/7JpkCpL3xrjsB2WCr6kPP/d13hE2GsNkBhM1OImwySQVtq0QzCpte+7t3fIP10522T1I2m7Dpub/7jrBZg+852J5EU1V5XMVrTkru1w29jlD5shn7Gp925adgZXiQ3Hs5fjqHXeF7e7L0fek6v+G9SXuKoQ7Y7fSqD6gQNkN0fpKVlTQJjvzTrK7k1XNlV7tuDL5MXGl95R4WOEsKm8Cdr9aeTb/z64Ir6Tk2P0iW06Mch7AZYlXlype7IInLNyu65Sp2GVJyQ/HrNSo7RF1h0//8hg+KY/E9cwibXgibIVZWrrQnE4eI1xE2ZQPwn7K+95MjbPpZGTbCubUa57fsdbYO6hI2vRA2Q/SoXHVFt8GSf0M0tGeDdawMm17nN/R28kvhCGHTC2EzRGN8RVIGypuiUjc+EYWwcRU2CqXk69LyuRGWOGbTOKexXuc3G39re9971Yc+JvqpnJkibAbKu+FSpfVlpMruwyZeX/xkLCvxynI9LDJsCq63GJ2/JBA6z294j9LzHd73/P3uUx/6CO/TycuH4vJdRthsUHtXXejZAFb5qxNjf+ZmjgibTenqwhM2aOF7NlxGoYe6O90WNBZhg8z9V/7yaeQvhc4ZYQNABWEDQAVhA0AFYQNABWEDQAVhA0AFYQNABWEDQAVhA0AFYQNABWGTKKcUKO/0bb9r2+u8o7jQdodwP2FfSj3ntmm/+TPomJdl49Y7v9gvhE3GB8jqxuCXpdMP5MaFTW11gNRWlx0eNuvsR5u+53cK567+ZL68c2TOCcugj7DJ9GsMur0DwmYYwmZeCJtM0qBap3skbKTlffQ7v9MgbOaFsFmHaxz2k1kQN8KsXNt0kavGfILORi7NNpeVdetnZfKwyfclXp4vi6X7nM9AOLzXMmZmwbO3TsyXh7LTl0O5B+Z0+diFUihz60G1Hf/8C3O2fFw9lwVYsn7h1NWDahlqhM0gfXsHvvFJIeIacBwKHfPYtoaNsE5e1gdN3Hto7rstk7xuGZb5vrTuh2O3m/ZS4kumtOxqU0xj2t2z8WGTBMxXR+ZU8TgEUp+waZbx2yVwmgibQUaGjQuJ5qe+a5zCz4W0NXKpfFpWev0++y7vd3fYCDZ8mbRKr7CJejLnLxyYM3fqoFgdNnXvqN7GqtddLsJmkCnCxn7qC3qHjbwPSVkx1IT1WvZn3bBxyxvbmXfYdPVA+oZNfAlVIWwaCJtBNtOzadPWyKfp2fgy6bEM6Nm4Xkx2TDvQs5kibPKeDWSEzSAjw6Zcv6uXEGtr5L4nUTdm/zjebvk6VSCVj5NwaYaNH2sR9lsKlNZlfrvbHLM5f/lFERY/mTNfCct6hE2+vg+ftNfiB6PTQIKMsBmkO2xCY21IeiF1w49VDbz1Uitt7Mlr2e3bRp8EU2j0nt2+XSfe9yqkSncfP3L71gzJ5rHVZfLjKfbz0B7DFsOmkH8zlX8btWogN1nfhowNoKy3JH37tWq7S0TYAFBB2ABQQdgAUEHYAFBB2ABQQdgAUEHYAFBB2ABQQdgAUEHYAFBB2ABQQdgAUEHYAFCxP2Fz/5W7S3iKO4UBTG/vejY3jt4XgfPK3BOWAdiePbyMemief3pvntyUlgHYFsIGgArCBoCKPQyb2+bJ28/mx6PbwjIA27KHYeP5gWK+mQLmgp4NABWM2QBQQdgAUEHYAFBB2ABQsXdhw+0KwDztT9hUN2LSqwHmaA8vowDMEWEDQAVhA0AFYQNABWEDQAVhA0AFYQNABWEDQAVhA0AFYQNAxfbD5uZT82P5e09MeAXsr/n0bNy9TdzXBOyrGV1G+ek8mTMY2E+EDQAVhA0AFTMKm4vm3svP5uTlQ3EZgN02q7Bxykmw+GYK2C/0bACoYMwGgArCBoAKwgaACsIGgIr5hA23KwB7bfthE92ISa8G2F8zuowCsM8IGwAqCBsAKggbACoIGwAqCBsAKggbACoIGwAqCBsAKggbACpGhY2b7MrdavDK3BOWA0AwQc/G363NDHsAukxzGWXv2H771NyQlgFAgbABoIKwAaBimrBxc9Iw8RWAdtOEjVMOFPPNFAABPRsAKhizAaCCsAGggrABoIKwAaBigrDhdgUAq40Km+pGTHo1AFaY5jIKAFYgbACoIGwAqCBsAKggbACoIGwAqCBsAKggbACoIGwAqCBsAKggbACoIGwAqCBsAKggbACoIGwAqCBsAKggbACoIGwAqCBsAKggbAAouGj+D+tatQzUWG/sAAAAAElFTkSuQmCC)]
2、doc_value
doc_values
默認情況下,大部分字段是索引的,這樣讓這些字段可被搜索。倒排索引(inverted index)允許查詢請求在詞項列表中查找搜索項(search term),并立即獲得包含該詞項的文檔列表。
倒排索引(inverted index):
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-D0WU7j87-1644556258952)(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUsAAAGlCAYAAABz+dRsAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAB/1SURBVHhe7d2LceO4EkDRF74jcAaKQClMEhuNH4kPhV/LTQlSN+R7qlg1a8seDglcgvJa+t8PAOBXxBIAFIglACgQSwBQIJYAoEAsAUCBWAKAArEEAAViCQAKxBIAFIglACgQSwBQIJYAoEAsAUCBWAKAwqlYXr+/fr6+hO3yLz0Kj/p38Xhc/0vn/fvn+l/60Lv9u/TH5evyY3lk2nNlc5ryuam3b7sT9XNp9uWTuvDgyjKeJLuT8pnCBKwGVxp839ftiL/ff9fvbcBvkbzusbKOZR3HGCubfQrHpTwnYf8s9mUwD/+7/ny7iVQcv5/SCWLpSB/LTRr8bx/7+9+bg2AWg2QQyzwG/3YUhHlofb4KwzG9qNfEMl/d8taujI7BnwZ8elw+puHKvf3HcavT/PlTjQfWIArh+KXjEbbRLWl9bPft4cnsMpZpnFQf728DR8Mlfl3xuKdX7s5iOdgf1b+5nbfPnnOrC/2LzI/l4ACFCHS3LfGE5MeVAz+f2PD982P3BwqT5lNIV+Hq+A3CFS8kg2g8HYFk8He+lXTeq/0aBCt8fjAWZ/9bzI6PNA/rC2x/UUmfH8zJ4Zw+pb5gPf/9/Jgey+GEDwEtBtNgEJePqU5ueOzgzx/o91jWk+AmDtD84X5yPMksBol03ov9kv7N1TF9xUonfc/ReXs9TSwHF5FdNSelcfWs9H1nXbSNvSaW++DptjaW8uQjlqVyIEvHvZ4Q4fjNHKC/nK+XE857OU6kf/PtQrNpL9rPMg3lTjMe6gvpobpwyPP5abOPuaH3rCxbxHJoeOxUg3qwsvz4WMZjkY/X3VjeDsy8iWseyp0wHqrzdS+W+TEvjOUHzdn5z1mGgzM4OaVfJh+xTAYTMh6b+thVq6fd7In8y/l6ue68p1CWH0v/5mpMdvs9+LpHuAjlbjAPw7+5/lgYH6Pj142rX+btaTHU9sdpjvmx3KUTVm3lZP5l8v3pWDbHbTTO8sA+tuEqMg3UYhPP11D/9Y99nwlG42l8YGLEjm08xrrjfHIVPjpPcXv3BSXH//d96PZ5dPy643zy39Md/9nxtfVgLAHgbyGWAKBALP+awa1St33SvdMJ8u113t59m+3E6GmQZnv7UzMGiCUAKBBLAFAglgCgQCwBQIFYAoACsQQABWIJAArEEgAUiCUAKBBLAFAglgCgQCwBQIFYAoACsQQABWIJAArEEgAUiCUAKBBLAFA4HcvunQW3rX0Xgv7l+duX4x+9K13zro2jtz/o/6L689vWvrw9+5s39nfH/uaN/d1p9jdjZQkACsQSABSIJQAoEEsAUCCWAKBALAFAgVgCgAKxBAAFYgkACsQSABSIJQAoEEsAUCCWAKBALAFAgVgCgAKxBAAFYgkACsRysvDKy9/Xn/r1mPHz8+/ncudVqP+y8MrhHBj3iOVkxFJCLCXEcg3nYhne06J9vwyUiKWEWEqI5RqI5WTmscxv5NROvvTmTXZz0jqW+U2wmje+SvtlGStiuQZiOZmHlWXYhypMMQjtO9u9l4OV5eBCEkJlfL6I5RqI5WQ+bsPrVZSHILiI5aa6kDgZz8RyDQ/EcpuAzXv2Vuc5fC4OwDAI0mN+fb/eYjLvXzdeBRUT7vh70m1U2mxXT+nfZR6mzb1zZMJHLLcDU78ntYNIEcs1PBDLfZDdrsYxesXzQMUkPcLVXMG7r8kDOEUmfH40eIoQ3/6e2/dt/x4LbmK5icfZy0T0EsvNMXba5y9tEMs1TLgNbyZBGoj1Cq98TPxztwIsQlgFJ69mj8eUf24mX/E9rHiK5bGyd7E/jmI5uOhbIpZrmBbLI36jiFWESVN+XRHIf5fvn+9t1Xl8PE98YnlfCsLlGo+T9dMT4nl/u7gfX5drdTdjiViu4WUrS/nc34tl+t7hz3sst8fug3n/e7cvCCHKX0gs78hBiAcn7JPxcRHP+5vF1XZ9d2J9ISGWa3g6luFEl3EYRaxRDdggPWd5fNE+sba/53pJA3n//GX7722Vmf9yYinqj2+Kp+l+OYhlXm0X+xCPle2YIZZrOBfLFKj4fE/a2pOsiOUuDlLp+9T/60v4SFgdFd+XWA51xylLobCblMaxzGO3PzDxQlJdXN6LWK7hXCzxKw8rS58crCydIpZrIJaTEUsJsZQQyzUQy8mIpYRYSojlGoglACgQSwBQIJYAoEAsAUCBWAKAArEEAAViCQAKxBIAFIglACgQSwBQIJaT8euOEn7dUcKvO66BWE5GLCXEUkIs1/B8LMPrJNq9FqA3xFJCLCXEcg3EcjLzWEovcjt4lfD3IpYS61iGMTs4N2G/mNsHYjmZh5VlP/hjqGzfa4ZYSuxXlv07E8R5bfuuA94Qy8l83IbXgz9MRvN9IpYSF7fh1R2Jh4urPw/EMh7I8H4ux9bEMt3yiZ/f5NVPu60+mXzEcpMHv5vjSiwlLmK5qeckC6DWyVgOrjjtynKwfO+e+2gfkyb2J0wkN7HcHIPfxYEllhIvsdxGTLoj4TyNnIrlMARVLNPB7o50PVH67xO/7hOW/Z5iGS9S2+Zif4ilxE8s4znaxwy34L1TsRye1EEs+wPdrEhZWb5eOMbbMb3GY2s/+ImlxEss48U1vj8/P9zpvWRlKcXyGA9pIpfbp0wiH7FMK4R0UMM+mQ9+YilxEct8cQ27ke4QndwheXHuOct2RXhE7/Z85GhihsFwHPjPueUe8RDLvEK4Tb8UT9P9IpYS+1jWF9cgze1PnaePOPkDnhzDfTKmyRduocuJ2TwmPy59Lmh+UntsHzCTrGOZj313KPOFzewYE0uJbSzTKrKZw7t40eWcZadj+bw4abor1oc8b+lhZekTsZTYryyh4SaWcUW0/pPKxFJCLCXEcg0Gsdwcz3WWW38bsCJiKSGWEmK5BptYAsBiiCUAKBBLAFAglgCgQCwBQIFYAoACsQQABWIJAArEEgAUiCUAKBDLyfh1Rwm/7ijh1x3XQCwnI5YSYikhlmt4PpbhRTE+40UwZiCWEmIpIZZrIJaTEUuJdSylF7mN+2UZK+tYhjE7ODdhv5jbB2I5GbGUOFhZ5lfoL3YiBMH4fNmvLAcXkjCvedOyErGcjFhKfNyGV6soJ0FwcRteXUjiueL9d2oPxDLdtlRbE8swCO98fpMHbbuVYybeBhTbAhEilhIfsdzOUFpFpc1+h3zEclPPSRZArZOxHFxx2pXl4Godo3fnMYP331k1OsRS4iWWm+MN83wEwUsstwNzXEhc7I4zp2I5DEEVy3SwuyNdT5T++8SvKyMcr3LrPWdCLCWOYnnc+fgYX35iGc/Rfmy4Be+diuXwpA5i2R/oZkWqWFnuYjDjyVslnMRS4iWWKQiXa7ywOzhXXmKZ7wCviy5UXu0lK0splsd4OK7st+23sbLKSpNYSnzEMgch7Ea6SFuvolzEMs3JuBvpDpFxXDn3nGW7Ijyid3vuZxS1MBiOAy8F9RdhYBPLdTmIZRWEKMbTdlzZxzKvtqsDE46V9YXEk5M/4Mkx3AdYCmCI2C2Wu+ox+XHpc8HxBHuzFScrDuJ6Mx1PSsRSYhzLPOa6HUihaMbwO9nGMq0iB//+PAdXmHfvcDqWz4uDs7tipcG8+okhlhIHK0un7FeW0HATy7ga9X+b/RtiKSGWEmK5BoNYbo7nOsvN7jZoJmIpIZYSYrkGm1gCwGKIJQAoEEsAUCCWAKBALAFAgVgCgAKxBAAFYgkACsQSABSIJQAoEMvJ+HVHCb/uKOHXHddALCcjlhJiKSGWa3g8lu1rUhKIgFhKiKWEWK7hwVjGgc+rKPfMYym9yO3gVcLfi1hKrGMZxuzg3IT9+pBXA5vhsViGicdBHPGwsuwHv4eLG7GU2K8sB6+WHub4+q8vOxOxnMzHbXg9+MNkNN8nYilxcRte3ZFw5zhyKpZxAo636lx3L+5bhjWeiDa2ccnPK6VP0zynbB8pYilxEctNviPp5yx281eWg+V7DGH5+LTySQMknqTPWPK7ieXmGPwuCkUsJV5iecxLztPQ5FjWEbwZTZT0setnvFFZ5imW8SK1bS72h1hK/MQynqN9zHAL3ntJLPsDHU9C9/F0u/5JJ8ZNLNOxzRcj+2NMLCVeYpnvAK8fdKc301tjWY2H8JzafkI+axL5iGVaIaSDGm/HrQc/sZS4iGW+uIbdSHeITu6QvJj+nOVoYobBUB34OHGOqIbvx3OWs+QVwu38pHia7hexlNjHsr64Bimen3TX96z5P+DZxGDuEzZt5STNP6VtJm6c4OtPJutY5mPfHcc0+O0mJbGU2MYy/1Cnn8+fMidneSyWEHlYWfpELCX2K0toEMvJiKWEWEqI5RqI5WTEUkIsJcRyDcQSABSIJQAoEEsAUCCWAKBALAFAgVgCgAKxBAAFYgkACsQSABSIJQAoEMvJ+HVHCb/uKOHXHddALCcjlhJiKSGWa3g8ls27BxKIiFhKiKWEWK7hwVjGgc+rKPeIpcQ6ltKL3Mb9sowVsVzDY7H85ZXS/zJiKXGwssx3Q8VOhFAZny9iuQZiORmxlPi4DQ/nJ+9HGMf27/1ELNdwKpbxNma8Vec6v9/LsZVhTbc9TWzDgBm90VnxffrxlG+tis140BFLiY9YdmPGQaSI5RrmrywHV+sYvfLxacCmARKv9r+8I2S6hSrHlMdBRiwlXmK5OX446ePuiFiuYXIs6wjejCZK+ti1j2AczP3tUTuo+gjbI5YSR7E87nzsb8F3xHINL4ll/1PyOFG6j6dB2328/d+Syq0ZVDGYebMPJ7GUeIll3I+vyzVe2B2cK2K5hrfGshoPx+rx3ufSfyt5WGkSS4mPWFZjJF2Urf8XOGK5hunPWaqef0wT5xik4fuVX5Nu589G585+vQuxlDiIZbqTKfchxtP2dpxYrmH+D3g2MZj7IExbGY98i90EJQ7aciCnYJbf59fP2w76HbGUGMcyj7tuB+J+WV5kieUaHoslRMRS4uM23CNiuQZiORmxlBBLCbFcA7GcjFhKiKWEWK6BWAKAArEEAAViCQAKxBIAFIglACgQSwBQIJYAoEAsAUCBWAKAArEEAAViORm/7ijh1x0l/LrjGojlZMRSQiwlxHIND8YyDnzrF9r1iFhKiKWEWK6BWE5GLCXWscwvFt2O2TSWDWNFLNfAbfhkxFLiYGU5eLX0ECrj80Us10AsJyOWEh+34eH85P3o3vvJBrFcw8lYNu97M4jCEYv05lBe3hvnXYilxEcsuzHsIFLEcg0PryylKOQrd/k5D7c670IsJV5iucm3406ecyeWa3hRLOtB+JcCQiwljmJ53PX4uOMhlmsglpMRS4mXWMb9+Lpc4+24g3NFLNdALCcjlhIfsQxhyuMz3Y5/Gy8vieUaiOVkxFLiIJbp9rvchxhP29txYrmGc7E8nhhvt9tgI5bEcsw4loP/xzJKt+XNmH0nYrmGh1eWGCOWEh+34R4RyzUQy8mIpYRYSojlGojlZMRSQiwlxHINxBIAFIglACgQSwBQIJYAoEAsAUCBWAKAArEEAAViCQAKxBIAFIglACgQy8n4dUcJv+4o4dcd10AsJyOWEmIpIZZreCqW4SSv9s6N4QVgX/fahcRSQiwlxHINxHIy81hKL3I7eJXw9yKWEutYhjE7ODdxftu9KLI3f+82/A+sLPvBH0Nl+14zxFJiv7LM76VezIswTxZbCL0YsZzMx214PfjDZDTfJ2IpsY/lproj8XBx9edcLIfvwVNffeKqpo5RFZDwPbbPp9vC8Njyz+Er8sTKkz5t3YBqPj+8EsbvdXvMvtX7N5OPWG6ac2UfKWIpcRHLTb4jefUcWdVzK8swIR+J5XYywn/nkO2PLyfTLXDH1S193W1MpVCWg6y7dYjfp7pC/omVZXQMfheFIpYSL7E85hTnacgslvFk9IEs/9zeBlSDahi9eLLz1w3D9YdiGY7Xdhx97A+xlPiJZTxH1SIFh/Vimb/Pceveb/nrhoPwr8QyHZ/LNR5v+8FPLCVeYhkvrpefa5jDo6e0/rYPW1nWhuH6E7GMxy8fq3hOrAc/sZS4iGW+uIbdSLfjHi76jkyPZTzot4/FiVoc+Edj2Xzf/Ji7g6z9mjQgPj2WeYVw+zemY2W6X+X5Rck+loO5lOaK/R2JH/NjuYmTNW37BN0P/AOxPL5H2EaBGz2u3p8j1vu270P4+z83lvnf2829fKHoPvEu5flFyTaW+Yc6/ZzI85hzFj0Xy3blNk2cWCte1TysLH0ilhL7lSU0TsXyv+ulCOMrn9cglp+HWEqI5RpOrixv/x/WcVubPjMXsfw8xFJCLNfw3G04APwRxBIAFIglACgQSwBQIJYAoEAsAUCBWAKAArEEAAViCQAKxBIAFIjlZPy6o4Rfd5Tw645rIJaTEUsJsZQQyzWcjOW7XkhjXcRSQiwlxHIND68sicKY+XFJL67cTb704r92c9I6ltKL3Mb9sowVsVwDsZzMw3EJ+1CFKQbB9iXvHKwsBxeSECrj80Us10AsJ/NxXOpVlIcguIjlprqQvOyV/s8hlmt4TSzzFfzYmluf/H4wzZZXPnFAS+/t87r3z5nBzUWkOQf2c9FHLLcDUz/v7iBSxHINL4jlNimqj6fBeScg4XtVg2V02+hlst3nJpabeNHxMhEdnb/jQuLjwkss1/CW2/C7jw2rzH7Qdl+zP85JhO7xFMu4Er9/oXofR7E87mzsb8F3xHINL4nlMUnLbfjYfQJJA7acXHF1usJ78riJZQrC5RpXUfbHzkss4358Xa6/3vG8C7Fcw/RYho83K8XxY2MA742RYxCF2ybfz1VmPmKZgxCPWDwn1qsoH7GMF/I0ltLtuPWFhFiu4fWxzM8PNY9VDZDwtd8/34usKnceYlkFIUjxNN0vB7HMq+1iH+Kxsr2QEMs1nIvl8cR4u5WDLU3MY9smbft84/GcUbMNJnM/8X2zjmW8WA2ilI+52aQ0jmUeu/2BSePVbowRyzU8vLJ8l9UGkoeVpU8OVpZOEcs1uI5ld0u/AGIpIZYSYrkGl7GMt977tlYod8RSQiwlxHIN7m/DAcADYgkACsQSABSIJQAoEEsAUCCWAKBALAFAgVgCgAKxBAAFYgkACsRyMn7dUcKvO0r4dcc1EMvJiKWEWEqI5RpOxrJ5Zzyi0CGWEmIpIZZreHhlSRTGOC4S61jmC337SlZxvyxjRSzXQCwn47hIHKwsB6+WHkJlfL6I5RqI5WQcF4mP2/BwfvJ+hLfasH87XGK5htfEsn2vntHj2vfhqR6TJ1bzHOkCA4pYSnzEcjtD7sYUsVzD/FimUJbnvrvV2R9TDY72eaP039t2vKvj4Pt6RCwlXmK5OS7mPl6Jn1iuYXoshyc+DM77tzv118WJ1b797QqDilhKHMXyuKuxvwXfEcs1vCaWYSC2Wzkwm1uhvGli6TxExFLiJZZxP74u1zgGHZwrYrmG96wsG6Po1V/HyvLz+IhlGEP59jvdjrfj7N1WGNd4xXOW6Rbn3rnvYplvi+7F0slPLn9DLCUOYjkYmzGetuOKWK7hXCyPJ8bbrRlsx3NCxVYGpP0+2+f+7ZFpYll9/SJvi0ssJcaxzGOu24E81uzGF7Fcw8Mry9carCwXQSwlDlaWThHLNRDLyYilhFhKiOUaiOVkxFJCLCXEcg1OYwkAvhBLAFAglgCgQCwBQIFYAoACsQQABWIJAArEEgAUiCUAKBBLAFAglpPx644Sft1Rwq87roFYTkYsJcRSQizXQCwnI5YSYikhlmsglpOZx1J6kVvFK9i/lnUs8/s+tS/yG/fLMlbWsQxjdnBuwn4t8qLb70AsJ/OwsuwHfwyC7UveOVhZDi4kIQjG58t+ZTm4kCzyNi7vRCwn83EbXg9+D0FwEctNdSFxEgT7WG6qC4mHi6s/52PZvn9ONdiEW5r0NdWH2/fpab7mGEDV3+f/lsBHLDfNeWpPyfv5iOV2YOq3YbbfIR+x3OQLSdy4/W6di+UgevEA34IZ/7s+0F1Auit6GsDFNw4DqDpp/WM8chPLzTH4XRwzL7HcHBcSH0HwEstjjnk5T86cimU4qV0I4gG+LdnbSdF+vv3vJAT0NnhjLH+JrkOe9vG44LjYH0exPO5qfDwn5yeW6c5w27gF752PZXdS+xVfFdUmgsfj00mptyaWzsM44iaWKQiXa1xF2Q9+L7FMQbhc4zh0cK68xDLsxzYHr+GOxMeFxJNpsawmY7jNiQe7/xphZdkgls/IQYjHPd6OWw9+H7HMQQi7kW7HrS8k43n1ZvniGg+MmwuJJ+ees6wOaBQnYn27vNsHwPe2qrkMJqlm8hLLx1VBCFI8TffLQSwH4zceK9sLiX0s64trkI4Vt+M352K5SwfxtvWhDPLjhEEQg1l+n/qxxPIx+bh2h/2X8/F6xrHMP9TpD0wMhTSO38A2lvlpsfGCZziW/qjzscRdHlaWPjlYWTplv7KEBrGcjFhKiKWEWK6BWE5GLCXEUkIs10AsAUCBWAKAArEEAAViCQAKxBIAFIglACgQSwBQIJYAoEAsAUCBWAKAArGcjF93lPDrjhJ+3XENxHIyYikhlhJiuQbbWD71Gou6V1x/N2IpIZYSYrkGYjmZeSylF7lNx9puTlrHUnqR27hflrGyjmUYs4NzE/bL8EWRvVn4NpxYSvrBH4Nge6wcrCwHF5IQBOPzZb+yHFxIwsXV+n2bfCGWk/m4Da8Hv4cguIjlprqQOAmCfSw31YXEw8XVnwdimW5bqu12RYqDsV66dwHJJyZt4klpHlcP7D6W8bZh2wwHno9YbppjZz0X87ix3498IbEfK5mLWG7yhSRu3H63TsZycMUJV+eTsTzcWR2m59jkq1v5tSngDiLlJpabY/A7mIj5HLnYleNC4iMIXmKZ59Q+ZlzsjjOnYjkMwUtimU7a3TN2O7H3o/penmJ5rLRd7I+jWKYLsZfn5PzEMi06HM0nT07FcnhSXxjL+ycsP2Z/b3IvQbj3b32zFITLdnz2VZT94PcSyxSEyzVebB2cKy+xjBfXy881zGF+uNNyvbLUxXJ/TJ4A9gPORyzr4xHPifXg9xHLHISwG+l23PpC4iKW+eIaD4ybC4kn556zrA7o7b+rOIaP3SZmnKjSgZejmL9OHkPN1+bnoYwHnYdYVkEIUjxN98tBLNvxu4nHyvZCYh/LwWIjHSvrC4knJ3/Ac4vYEcBwUOuVZByAzWOKiVp9j3JrJ3M6YbetHNSD0ObHG0bBOpbiRSYfG7NJaRxL8WKaQtGM4XeyjWVaRQ7+/Xkem+2aM6dj2RnE8i/zsLL0ycHK0in7lSU0iOVkxFJCLCXEcg3EcjJiKSGWEmK5hudjCQB/ALEEAAViCQAKxBIAFIglACgQSwBQIJYAoEAsAUCBWAKAArEEAAViORm/7ijh1x0l/LrjGojlZMRSQiwlxHINxHIyYikhlhJiuQZiORmxlFjHUnqR27hflrEilmsglpMRS4mDleXg1dJDqIzPF7FcA7GcjFhKfNyGh/OT9yO8Fqv9uxgSyzU8EMt021Js5fvgxMFY3+pUAQlX9+3z+T1h2j/nx2+DJwyi/ePNn2/yrVXe2oF/m6B5kvTfY67q34qCj1h2Y8Z+h4jlIk7GcvAmYQ1dLLfBEf47h3d/fB+28PfkkO6fqF6VPQ36cpB1K4Ui7Plx6e9/1dgklhIvsdzkMdiMUyvEcg0PxfJeDLSxjGOjnEBtLNP3KAMp/fnQxjzFshqIvwf/GcRS4iiWYezssbS/Bd8RyzU8cBueghkG27Y1YXhvLIv9KLY2lq8K4wixlHiJZdyPr8v11wv/uxDLNTz5A55+pfneWNZ/T49Y+uEjlvG57zRu0lh85/gYIZZreDKWgziEiN1ub2L4iqDOimV6/P1BRiz9cBDLMH7qfYjxtL0dJ5ZrOBnLFKhq61d3cQCmbQ/HPkinx3I32p/+BzzE0oPyXBtI466PUh5D/Th+F2K5hqdXlqgRS4lxLB0jlmsglpMRSwmxlBDLNRDLyYilhFhKiOUaiCUAKBBLAFAglgCgQCwBQIFYAoACsQQABWIJAArEEgAUiCUAKBBLAFAglpPx644Sft1Rwq87roFYTkYsJcRSQizXMD2WIRaGrw1ojVhKiKWEWK7hgVjef8MvYmkcS+lFbgevEv5exFJiHcs4Z/tzE/brD8/lFrGczMPKsh/8MVS27zVDLCX2K8v8JoTFvA0XVx/vfukFsZzMQyzbwR8mo/k+EUuJi9vw6o7Ew8XVn1Ox3A/g7b1uyu0WxyOW6bYvboMrVPX5bfuQWeQjlps8+NNmf3iJpcRFLDf5jiRuf3fBI3nRynI72EUwusHQLfHTSugDZpKbWG6Oc+HiuBJLiZdYHvOQ8zT0ltvwOiDC14eArn818xTLMAmbC5cdYinxE8t4jvYxwy14zyyWYRJ3G7GcJj3NcbnG23H7wU8sJV5iGS+ul59rmMP8cKflZ2X5IXzEMq0Q0gSM58R68BNLiYtY5otr2I20oHFxR+LHA7FMJ1c4kL/H0svkfQ0PscwrhNs5SPE03S9iKbGPZX1xDVI8uR2/eSiWx8E9ttvE1MRyFx9Xfo9t+4CZZB3LfFy7Q5kGv90xJpYS21jmp8XqObuLF13OWfZgLCGxjqVfxFJiv7KEBrGcjFhKiKWEWK6BWE5GLCXEUkIs10AsAUCBWAKAArEEAAViCQAKxBIAFIglACgQSwBQIJYAoEAsAUCBWAKAArEEAAViCQAKxBIAFIglACgQSwBQIJYAoEAsAUCBWAKAwulY5ncPLLf2FfHzu8LdtvZtb/M7ypVb8+5y/11/vqvPb1v/F9Wf37b2rTvZ37yxvzv2N2/s706zvxkrSwBQIJYAoEAsAUCBWAKAArEEAAViCQAKxBIAFIglACgQSwBQIJYA8Kufn/8DXmcpM3JhKqYAAAAASUVORK5CYII=)]
如果我們想要獲得所有包含 brown 的文檔的詞的完整列表,我們會創建如下查詢:
GET /my_index/_search{"query" : {"match" : {"body" : "brown" } }, "aggs" : {"popular_terms": {"terms" : {"field" : "body" } } }}
倒排索引是根據詞項來排序的,所以我們首先在詞項列表中找到 brown,然后掃描所有列,找到包含 brown 的文檔。我們可以快速看到 Doc_1 和 Doc_2 包含 brown 這個 token。
然后,對于聚合部分,我們需要找到 Doc_1 和 Doc_2 里所有唯一的詞項。用倒排索引做這件事情代價很高: 我們會迭代索引里的每個詞項并收集 Doc_1 和 Doc_2 列里面 token。這很慢而且難以擴展:隨著詞項和文檔的數量增加,執行時間也會增加。
Doc values 通過轉置兩者間的關系來解決這個問題。倒排索引將詞項映射到包含它們的文檔,doc values 將文檔映射到它們包含的詞項:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-deqcJ89G-1644556258957)(data:image/png;base64,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)]
當數據被轉置之后,想要收集到 Doc_1 和 Doc_2 的唯一 token 會非常容易。獲得每個文檔行,獲取所有的詞項,然后求兩個集合的并集。
Doc values 可以使聚合更快、更高效并且內存友好。Doc values 的存在是因為倒排索引只對某些操作是高效的。
倒排索引的優勢:在于查找包含某個項的文檔,而對于從另外一個方向的相反操作并不高效,即:確定哪些項是否存在單個文檔里,聚合需要這種訪問模式。
在 Elasticsearch 中,Doc Values 就是一種列式存儲結構,默認情況下每個字段的 Doc Values 都是激活的,Doc Values 是在索引時創建的。當字段索引時,Elasticsearch 為了能夠快速檢索,會把字段的值加入倒排索引中,同時它也會存儲該字段的 Doc Values。
Elasticsearch 中的 Doc Values 常被應用到以下場景:
對一個字段進行排序對一個字段進行聚合某些過濾,比如地理位置過濾某些與字段相關的腳本計算
因為文檔值(doc values)被序列化到磁盤,我們可以依靠操作系統的幫助來快速訪問。當 working set 遠小于節點的可用內存,系統會自動將所有的文檔值保存在內存中,使得其讀寫十分高速;當其遠大于可用內存,操作系統會自動把 Doc Values 加載到系統的頁緩存中,從而避免了 jvm 堆內存溢出異常。
因此,搜索和聚合是相互緊密纏繞的。搜索使用倒排索引查找文檔,聚合操作收集和聚合 doc values 里的數據。
doc values 支持大部分字段類型,但是text 字段類型不支持(因為analyzed)。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LgoL0gRs-1644556258959)(data:image/png;base64,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)]
(1) status_code 字段默認啟動 doc_values 屬性;
(2) session_id 顯式設置 doc_values = false,但是仍然可以被查詢;
如果確信某字段不需要排序或者聚合,或者從腳本中訪問字段值,那么我們可以設置 doc_values = false,這樣可以節省磁盤空間。
3、executionHint
1、global ordinals
(1)what’s this?
當我們使用doc values或者fielddata存儲時,在磁盤中存儲的值不是真正的字段值,而是一個字典值(ordinal)。當我們進行聚合查詢的時候,es會把這個字典值跟真正字段值的映射字典加載到內存中,并對結果集做映射,轉化為真正的值。這份映射關系是shard級別的,為這個shard里面是所有segment服務,這也是global的體現。
(2)detail
字典關系是lazy init的,只有第一次使用的時候才會加載到內存中。在es的內存表現中提現成fielddata,這也是全keyword的index為什么也會有fielddata使用的原因。只會加載命中的segment的字典不會加載全部。字典關系在shard被觸發refresh以后就會失效。下次使用的時候需要再重新構建。所以可以提高refresh_interval的值,減少fresh頻率提高字典的生存時間。
2、eager_global_ordinals
(1)what’s this?
當在global ordinals的時候,refresh以后下一次查詢字典就需要重新構建,在追求查詢的場景下很影響查詢性能。可以使用eager_global_ordinals,即在每次refresh以后即可更新字典,字典常駐內存,減少了查詢的時候構建字典的耗時。
(2)使用場景
因為這份字典需要常駐內存,并且每次refresh以后就會重構,所以增大了內存以及cpu的消耗。推薦在低寫高查、數據量不大的index中使用。
(3)使用
PUT my_index/_mapping{"properties": {"tags": {"type": "keyword", "eager_global_ordinals": true } }}
3、execution_hint
(1)what’ this?
上面介紹了global ordinal的使用場景,是doc_values以及fileddata的默認數據架構。除了這種模式,還可以選擇map模式。即不再使用字典而是直接把值加載到內存中計算,減去了構建字典的耗時。當查詢的結果集很小的情況下,可以使用map的模式不去構建字典。使用map還是global_ordinals的取決于構建字典的開銷與加載原始字典的開銷。當結果集大到一定程序,map的內存開銷的代價可能抵消了構建字典的開銷。
(2)how to use?
GET /_search{"aggs" : {"tags" : {"terms" : {"field" : "tags", "execution_hint": "map" } } }}
4、Shard Size
為了提高該聚合的精確度,可以通過shard_size參數設置協調節點向各個分片請求的詞根個數,然后在協調節點進行聚合,最后只返回size個詞根給到客戶端,shard_size >= size,如果shard_size設置小于size,ES會自動將其設置為size,默認情況下shard_size建議設置為(1.5 * size + 10)。
三、java實現對Es的curd
//match查詢age是20的條件 QueryBuilders.matchQuery("age",20); //term查詢age是20的條件 QueryBuilders.termQuery("age",20); //terms查詢age是20或者200,或者50的條件 QueryBuilders.termsQuery("age",20,200,50); //query_string全文檢索“xiumu” QueryBuilders.queryStringQuery("xiumu"); //query_string檢索username是“xiumu” QueryBuilders.queryStringQuery("xiumu").field("username"); //multi_match查詢字段username或者description的值是xiumu QueryBuilders.multiMatchQuery("xiumu","username","description"); //range查詢字段age的范圍是在[18-200]之間 QueryBuilders.rangeQuery("age").gte(18).lte(200); //exits查詢字段age有值 QueryBuilders.existsQuery("age"); //wildcard查詢字段description是以“男人”結尾的 QueryBuilders.wildcardQuery("description","*男人"); //bool查詢 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //bool查詢里添加must多個條件 boolQueryBuilder.must(QueryBuilders.termQuery("age",20)); boolQueryBuilder.must(QueryBuilders.existsQuery("age")); boolQueryBuilder.must(QueryBuilders.wildcardQuery("description","*男人"));
(1)統計某個字段的數量 ValueCountBuilder vcb= AggregationBuilders.count("count_uid").field("uid");(2)去重統計某個字段的數量(有少量誤差) CardinalityBuilder cb= AggregationBuilders.cardinality("distinct_count_uid").field("uid");(3)聚合過濾FilterAggregationBuilder fab= AggregationBuilders.filter("uid_filter").filter(QueryBuilders.queryStringQuery("uid:001"));(4)按某個字段分組TermsBuilder tb= AggregationBuilders.terms("group_name").field("name");(5)求和SumBuilder sumBuilder=AggregationBuilders.sum("sum_price").field("price");(6)求平均AvgBuilder ab= AggregationBuilders.avg("avg_price").field("price");(7)求最大值MaxBuilder mb= AggregationBuilders.max("max_price").field("price"); (8)求最小值MinBuilder min=AggregationBuilders.min("min_price").field("price");(9)按日期間隔分組DateHistogramBuilder dhb= AggregationBuilders.dateHistogram("dh").field("date");(10)獲取聚合里面的結果TopHitsBuilder thb= AggregationBuilders.topHits("top_result");(11)嵌套的聚合NestedBuilder nb= AggregationBuilders.nested("negsted_path").path("quests");(12)反轉嵌套AggregationBuilders.reverseNested("res_negsted").path("kps ");
package com.robin.elasticsearch;import com.alibaba.fastjson.JSON;import com.robin.elasticsearch.common.DataUtil;import com.robin.elasticsearch.entity.User;import com.robin.elasticsearch.entity.User2;import com.robin.elasticsearch.entity.User3;import com.robin.elasticsearch.reponsity.UserMapper;import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;import org.elasticsearch.action.bulk.BulkRequest;import org.elasticsearch.action.bulk.BulkResponse;import org.elasticsearch.action.delete.DeleteRequest;import org.elasticsearch.action.delete.DeleteResponse;import org.elasticsearch.action.get.GetRequest;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.action.index.IndexRequest;import org.elasticsearch.action.index.IndexResponse;import org.elasticsearch.action.search.SearchRequest;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.action.support.master.AcknowledgedResponse;import org.elasticsearch.action.update.UpdateRequest;import org.elasticsearch.action.update.UpdateResponse;import org.elasticsearch.client.RequestOptions;import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.client.indices.CreateIndexRequest;import org.elasticsearch.client.indices.CreateIndexResponse;import org.elasticsearch.client.indices.GetIndexRequest;import org.elasticsearch.common.xcontent.XContentType;import org.elasticsearch.index.query.*;import org.elasticsearch.rest.RestStatus;import org.elasticsearch.search.SearchHit;import org.elasticsearch.search.aggregations.Aggregation;import org.elasticsearch.search.aggregations.AggregationBuilders;import org.elasticsearch.search.aggregations.Aggregations;import org.elasticsearch.search.aggregations.BucketOrder;import org.elasticsearch.search.aggregations.bucket.filter.Filters;import org.elasticsearch.search.aggregations.bucket.filter.FiltersAggregationBuilder;import org.elasticsearch.search.aggregations.bucket.filter.FiltersAggregator;import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder;import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;import org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder;import org.elasticsearch.search.aggregations.bucket.range.DateRangeAggregationBuilder;import org.elasticsearch.search.aggregations.bucket.range.IpRangeAggregationBuilder;import org.elasticsearch.search.aggregations.bucket.range.Range;import org.elasticsearch.search.aggregations.bucket.range.RangeAggregationBuilder;import org.elasticsearch.search.aggregations.bucket.terms.Terms;import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;import org.elasticsearch.search.aggregations.metrics.*;import org.elasticsearch.search.builder.SearchSourceBuilder;import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;import org.elasticsearch.search.sort.FieldSortBuilder;import org.elasticsearch.search.sort.SortBuilders;import org.elasticsearch.search.sort.SortOrder;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.domain.PageRequest;import org.springframework.data.elasticsearch.core.AggregationsContainer;import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.clients.elasticsearch7.ElasticsearchAggregations;import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Map;@SpringBootTestclass ESTests {@Autowired UserMapper userMapper; @Autowired RestHighLevelClient restHighLevelClient; @Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate; //創建索引 @Test void createIndex() throws IOException {CreateIndexRequest request = new CreateIndexRequest("zkwz"); CreateIndexResponse exists = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT); } //刪除索引 @Test void isExistIndex() throws IOException {GetIndexRequest request = new GetIndexRequest("zkwz"); boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT); System.out.println(exists); } //刪除索引 @Test void deleteIndex() throws IOException {DeleteIndexRequest request = new DeleteIndexRequest("user"); AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT); System.out.println(delete.isAcknowledged()); } //創建文檔 @Test void createDoc() throws IOException {IndexRequest request = new IndexRequest("user"); User user = new User("111", "cwx", 23); IndexRequest source = request.id("123").source(JSON.toJSONString(user), XContentType.JSON); String id = source.id(); IndexResponse index = restHighLevelClient.index(request, RequestOptions.DEFAULT); System.out.println(index); } //獲取文檔的信息 @Test void getDocInfo() throws IOException {//創建獲取文檔的請求 GetRequest request = new GetRequest("user", "123"); boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT); System.out.println(exists); GetResponse documentFields = restHighLevelClient.get(request, RequestOptions.DEFAULT); String source = documentFields.getSourceAsString(); System.out.println(source); } //根據id更新文檔 @Test void updateDocById() throws IOException {UpdateRequest request = new UpdateRequest("user", "123"); request.doc(JSON.toJSONString(new User("111", "cwx", 33)), XContentType.JSON); UpdateResponse update = restHighLevelClient.update(request, RequestOptions.DEFAULT); RestStatus status = update.status(); System.out.println(status); } //根據id刪除文檔 @Test void deleteDocById() throws IOException {DeleteRequest request = new DeleteRequest("user", "123"); DeleteResponse delete = restHighLevelClient.delete(request, RequestOptions.DEFAULT); RestStatus status = delete.status(); System.out.println(status); } //批量創建文檔 @Test void createDocBulk() throws IOException {BulkRequest request = new BulkRequest(); User user1 = new User("777", "thegoodmen", 30); User user2 = new User("888", "thegoodwomen", 50); User user3 = new User("999", "thewellboy", 23); User user4 = new User("100", "thewellgirl", 43); User user5 = new User("121", "thegirlmen", 12); ArrayListlist = new ArrayList<>(); list.add(user1); list.add(user2); list.add(user3); list.add(user4); list.add(user5); for (User user : list) {request.add(new IndexRequest("user").source(JSON.toJSONString(user), XContentType.JSON)); } BulkResponse bulk = restHighLevelClient.bulk(request, RequestOptions.DEFAULT); boolean status = bulk.hasFailures(); System.out.println(status); } //基本查詢 @Test void selectByAge() throws IOException {SearchRequest request = new SearchRequest(); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //matchQuery是分詞之后再查詢的、termQuery是直接進行匹配(但是這個查詢不到數據,換這個可以matchPhraseQuery) MatchQueryBuilder builder = QueryBuilders.matchQuery("name", "good"); searchSourceBuilder.query(builder); request.source(searchSourceBuilder); SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT); Iteratoriterator = search.getHits().iterator(); while (iterator.hasNext()) {System.out.println(iterator.next()); } } //單條件查詢 @Test void select1() throws IOException {//左右模糊查詢,相當于MySQL的%good% SearchHitssearchHits = elasticsearchRestTemplate.search( new NativeSearchQuery(QueryBuilders.queryStringQuery("good").field("name")), User.class, IndexCoordinates.of("user")); //精準匹配,相當于name="good" SearchHitssearchHits1 = elasticsearchRestTemplate.search( new NativeSearchQuery(QueryBuilders.termQuery("name", "good")), User.class, IndexCoordinates.of("user")); //普通匹配,相當于name like "%good%" SearchHitssearchHits2 = elasticsearchRestTemplate.search( new NativeSearchQuery(QueryBuilders.matchQuery("name", "good")), User.class, IndexCoordinates.of("user")); //模糊匹配 SearchHitssearchHits3 = elasticsearchRestTemplate.search( new NativeSearchQuery(QueryBuilders.fuzzyQuery("name", "good")), User.class, IndexCoordinates.of("user")); //前綴匹配 SearchHitssearchHits6 = elasticsearchRestTemplate.search( new NativeSearchQuery(QueryBuilders.prefixQuery("name", "men")), User.class, IndexCoordinates.of("user")); //多字段的模糊匹配 SearchHitssearchHits7 = elasticsearchRestTemplate.search( new NativeSearchQuery(QueryBuilders.multiMatchQuery("aaa", "name")), User.class, IndexCoordinates.of("user")); //前綴匹配 SearchHitssearchHits8 = elasticsearchRestTemplate.search( new NativeSearchQuery(QueryBuilders.wildcardQuery("name", "m*n")), User.class, IndexCoordinates.of("user")); //多內容多字段的模糊匹配 String[] strings = {"good", "men"}; SearchHitssearchHits9 = elasticsearchRestTemplate.search( new NativeSearchQuery(QueryBuilders.moreLikeThisQuery(new String[]{"aaa"}, MoreLikeThisQueryBuilder.Item.EMPTY_ARRAY)), User.class, IndexCoordinates.of("user")); for (org.springframework.data.elasticsearch.core.SearchHite1 : searchHits9.getSearchHits()) {System.out.println(e1.getContent()); } } //多條件查詢 @Test void select2() throws IOException {//數值型、日期、Ip的范圍查詢,相當于 between 80 and 90 ,80包含,90不包含 SearchHitssearchHits1 = elasticsearchRestTemplate.search( new NativeSearchQuery(QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("age").from(80).to(90).includeLower(true).includeUpper(false))), User.class, IndexCoordinates.of("user")); //范圍查詢、大于50小于等于90 SearchHitssearchHits2 = elasticsearchRestTemplate.search( new NativeSearchQuery(QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("age").gt(50).lte(90))), User.class, IndexCoordinates.of("user")); for (org.springframework.data.elasticsearch.core.SearchHite1 : searchHits1.getSearchHits()) {System.out.println(e1.getContent()); } } //多條件查詢 @Test void select3() {// 排序 FieldSortBuilder price = SortBuilders.fieldSort("age").order(SortOrder.DESC); // 高亮顯示 HighlightBuilder highlightBuilder = new HighlightBuilder().field("name"); // 分頁 PageRequest pageRequest = PageRequest.of(0, 2); // 查詢條件 BoolQueryBuilder queryBuilder1 = new BoolQueryBuilder().must(new MatchQueryBuilder("name", "陳萬祥")); BoolQueryBuilder queryBuilder2 = new BoolQueryBuilder().must(new MatchPhraseQueryBuilder("loc", "武威市")); BoolQueryBuilder queryBuilder3 = new BoolQueryBuilder().must(QueryBuilders.queryStringQuery("蘭州市").field("name")); //求和 SumAggregationBuilder field = AggregationBuilders.sum("sum").field("age"); //求平均值 AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avg").field("age"); ValueCountAggregationBuilder countAggregationBuilder = AggregationBuilders.count("count").field("name"); // 組裝上述查詢條件 NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(queryBuilder1) .withSorts(price) .withHighlightBuilder(highlightBuilder) .withPageable(pageRequest) .build(); NativeSearchQuery searchQuery2 = new NativeSearchQueryBuilder() .withAggregations(field) .withAggregations(avgAggregationBuilder) .withAggregations(countAggregationBuilder) .build(); SearchHitsuser = elasticsearchRestTemplate.search(searchQuery, User2.class, IndexCoordinates.of("user")); for (org.springframework.data.elasticsearch.core.SearchHithit : user.getSearchHits()) {System.out.println(hit.getContent()); MaphighlightFields = hit.getHighlightFields(); System.out.println(highlightFields.toString()); } AggregationsContainer aggregations = user.getAggregations(); ElasticsearchAggregations aggregations1 = (ElasticsearchAggregations) aggregations; Aggregations aggregations2; if (aggregations1 != null) {aggregations2 = aggregations1.aggregations(); Sum sum = aggregations2.get("sum"); Avg avg = aggregations2.get("avg"); ValueCount count = aggregations2.get("count"); System.out.println(DataUtil.rmZeroSuper(sum.getValue())); System.out.println(DataUtil.rmZeroSuper(avg.getValue())); System.out.println(DataUtil.rmZeroSuper(count.getValue())); } } //最基礎的聚合查詢 @Test void select4() throws IOException {SearchRequest request = new SearchRequest("user"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchQuery("name", "yyy")); TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("ageAvg").field("age").size(10); sourceBuilder.aggregation(termsAggregationBuilder); AvgAggregationBuilder sumAggregationBuilder = AggregationBuilders.avg("avg").field("age"); sourceBuilder.aggregation(sumAggregationBuilder); request.source(sourceBuilder); SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT); Aggregations aggregations = searchResponse.getAggregations(); Avg ageAvg = aggregations.get("avg"); System.out.println(ageAvg.getValue()); Terms terms = aggregations.get("ageAvg"); for (Terms.Bucket e1 : terms.getBuckets()) {System.out.println("年齡是" + e1.getKeyAsString() + "=====>" + "人數是" + e1.getDocCount()); } } //先分組再得到不同分組的指標查詢 @Test void select5() {//先分組,并按指標排序 TermsAggregationBuilder termsAggregationBuilder1 = AggregationBuilders.terms("team_count").field("team").order(BucketOrder.aggregation("max_age", true)); termsAggregationBuilder1.subAggregation(AggregationBuilders.max("max_age").field("age")); termsAggregationBuilder1.subAggregation(AggregationBuilders.avg("avg_age").field("age")); termsAggregationBuilder1.subAggregation(AggregationBuilders.min("min_age").field("age")); termsAggregationBuilder1.subAggregation(AggregationBuilders.sum("sum_age").field("age")); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withAggregations(termsAggregationBuilder1) .build(); SearchHitsuser = elasticsearchRestTemplate.search(searchQuery, User3.class, IndexCoordinates.of("user1")); for (org.springframework.data.elasticsearch.core.SearchHithit : user.getSearchHits()) {System.out.println(hit.getContent()); } AggregationsContainer aggregations = user.getAggregations(); ElasticsearchAggregations aggregations1 = (ElasticsearchAggregations) aggregations; Aggregations aggregations2; if (aggregations1 != null) {aggregations2 = aggregations1.aggregations(); Terms terms = aggregations2.get("team_count"); //獲取聚合值的兩種方法 for (Terms.Bucket bucket : terms.getBuckets()) {Max max_age = bucket.getAggregations().get("max_age"); Min min_age = bucket.getAggregations().get("min_age"); Sum sum_age = bucket.getAggregations().get("sum_age"); Avg avg_age = bucket.getAggregations().get("avg_age"); System.out.println(bucket.getKeyAsString() + "的最大值是:" + max_age.getValue() + "的最小值是:" + min_age.getValue() + "的和是:" + sum_age.getValue() + "的平均值是:" + avg_age.getValue()); } for (Terms.Bucket bucket : terms.getBuckets()) {MapasMap = bucket.getAggregations().asMap(); double max_age = ((ParsedMax) asMap.get("max_age")).getValue(); double min_age = ((ParsedMin) asMap.get("min_age")).getValue(); double sum_age = ((ParsedSum) asMap.get("sum_age")).getValue(); double avg_age = ((ParsedAvg) asMap.get("avg_age")).getValue(); System.out.println(bucket.getKeyAsString() + "的最大值是:" + max_age + "的最小值是:" + min_age + "的和是:" + sum_age + "的平均值是:" + avg_age); } } } //區間分組查詢 @Test void select6() {HistogramAggregationBuilder histogramAggregationBuilder = AggregationBuilders.histogram("his_age").field("age").interval(10); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withAggregations(histogramAggregationBuilder) .build(); SearchHitsuser = elasticsearchRestTemplate.search(searchQuery, User3.class, IndexCoordinates.of("user1")); for (org.springframework.data.elasticsearch.core.SearchHithit : user.getSearchHits()) {System.out.println(hit.getContent()); } AggregationsContainer aggregations = user.getAggregations(); ElasticsearchAggregations aggregations1 = (ElasticsearchAggregations) aggregations; Aggregations aggregations2; if (aggregations1 != null) {aggregations2 = aggregations1.aggregations(); Histogram terms = aggregations2.get("his_age"); for (Histogram.Bucket bucket : terms.getBuckets()) {System.out.println(bucket.getKeyAsString() + "的數量是:" + bucket.getDocCount()); } } } //時間區間分組查詢 @Test void select7() {/* calendarInterval表示時間間隔是類型、minDocCount設置最小值、format設置輸出時間的格式化、 missing當那個統計字段為null的時候,填充某個值,然后按照填充的值,統計計算 */ DateHistogramAggregationBuilder aggregationBuilder = AggregationBuilders.dateHistogram("his_birth") .field("birth") .calendarInterval(DateHistogramInterval.MONTH) .minDocCount(0) .format("yyyy-MM-dd") .missing("2021-07-27"); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withAggregations(aggregationBuilder) .build(); SearchHitsuser = elasticsearchRestTemplate.search(searchQuery, User3.class, IndexCoordinates.of("user1")); for (org.springframework.data.elasticsearch.core.SearchHithit : user.getSearchHits()) {System.out.println(hit.getContent()); } ElasticsearchAggregations aggregations = (ElasticsearchAggregations) user.getAggregations(); if (aggregations != null) {Histogram terms = aggregations.aggregations().get("his_birth"); for (Histogram.Bucket bucket : terms.getBuckets()) {System.out.println(bucket.getKeyAsString() + "的數量是:" + bucket.getDocCount()); } } } //指定范圍區間分組查詢 @Test void select8() {/* calendarInterval表示時間間隔是類型、minDocCount設置最小值、format設置輸出時間的格式化、 missing當那個統計字段為null的時候,填充某個值,然后按照填充的值,統計計算 */ RangeAggregationBuilder aggregationBuilder = AggregationBuilders.range("range_age") .field("age") .addUnboundedTo(10) .addRange(11, 30) .addRange(31, 50) .addUnboundedFrom(100); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withAggregations(aggregationBuilder) .build(); SearchHitsuser = elasticsearchRestTemplate.search(searchQuery, User3.class, IndexCoordinates.of("user1")); for (org.springframework.data.elasticsearch.core.SearchHithit : user.getSearchHits()) {System.out.println(hit.getContent()); } ElasticsearchAggregations aggregations = (ElasticsearchAggregations) user.getAggregations(); if (aggregations != null) {Range terms = aggregations.aggregations().get("range_age"); for (Range.Bucket bucket : terms.getBuckets()) {System.out.println(bucket.getKeyAsString() + "的數量是:" + bucket.getDocCount()); //起始范圍值 Object from = bucket.getFrom(); //終止范圍值 Object to = bucket.getTo(); System.out.println(from + "\t" + to); } } } //指定時間范圍區間分組查詢 @Test void select9() {DateRangeAggregationBuilder aggregationBuilder = AggregationBuilders.dateRange("data_range_birth") .field("birth") .format("yyyy") .addUnboundedTo("2000") .addRange("2001", "2010") .addRange("2011", "2020") .addUnboundedFrom("2021"); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withAggregations(aggregationBuilder) .build(); SearchHitsuser = elasticsearchRestTemplate.search(searchQuery, User3.class, IndexCoordinates.of("user1")); for (org.springframework.data.elasticsearch.core.SearchHithit : user.getSearchHits()) {System.out.println(hit.getContent()); } ElasticsearchAggregations aggregations = (ElasticsearchAggregations) user.getAggregations(); if (aggregations != null) {Range terms = aggregations.aggregations().get("data_range_birth"); for (Range.Bucket bucket : terms.getBuckets()) {System.out.println(bucket.getKeyAsString() + "的數量是:" + bucket.getDocCount()); } } } //指定ip區間分組查詢 @Test void select10() {//TODO 這個地方的ip類型不能用來聚合,加上.keyword也不行,不知如何解決 IpRangeAggregationBuilder aggregationBuilder = AggregationBuilders.ipRange("ip_range") .field("ip") .addUnboundedTo("192.168.0.0") .addRange("192.168.0.1", "192.168.0.122") .addRange("192.168.5.0", "192.168.7.134") .addUnboundedFrom("192.168.12.122"); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withAggregations(aggregationBuilder) .build(); SearchHitsuser = elasticsearchRestTemplate.search(searchQuery, User3.class, IndexCoordinates.of("user1")); for (org.springframework.data.elasticsearch.core.SearchHithit : user.getSearchHits()) {System.out.println(hit.getContent()); } ElasticsearchAggregations aggregations = (ElasticsearchAggregations) user.getAggregations(); if (aggregations != null) {Range terms = aggregations.aggregations().get("ip_range"); for (Range.Bucket bucket : terms.getBuckets()) {System.out.println(bucket.getKeyAsString() + "的數量是:" + bucket.getDocCount()); } } } //指定過濾條件分組查詢 @Test void select11() {FiltersAggregationBuilder aggregationBuilder = AggregationBuilders.filters("filter", new FiltersAggregator.KeyedFilter("men", QueryBuilders.termQuery("sex", "true")), new FiltersAggregator.KeyedFilter("women", QueryBuilders.termQuery("sex", "false"))); // 高亮顯示 HighlightBuilder highlightBuilder = new HighlightBuilder().field("sex").preTags("").postTags(""); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withAggregations(aggregationBuilder) .withHighlightBuilder(highlightBuilder) .build(); SearchHitsuser = elasticsearchRestTemplate.search(searchQuery, User3.class, IndexCoordinates.of("user1")); for (org.springframework.data.elasticsearch.core.SearchHithit : user.getSearchHits()) {MaphighlightFields = hit.getHighlightFields(); System.out.println(hit.getContent()); System.out.println(highlightFields.toString()); } ElasticsearchAggregations aggregations = (ElasticsearchAggregations) user.getAggregations(); if (aggregations != null) {Filters terms = aggregations.aggregations().get("filter"); for (Filters.Bucket bucket : terms.getBuckets()) {System.out.println(bucket.getKeyAsString() + "的數量是:" + bucket.getDocCount()); } } }}
四、命令的方式實現對Es的curd
DELETE /user3PUT /user{"settings": {"number_of_replicas": 2, "number_of_shards": 3 }, "mappings": {"properties": {"name":{"type": "text", "analyzer": "ik_max_word" }, "sex":{"type": "boolean" }, "age":{"type": "long" }, "loc":{"type": "text", "analyzer": "ik_max_word" }, "team":{"type": "keyword" }, "birth":{"type": "date" }, "id":{"type": "ip" }, "country":{"type": "keyword" }, "habby":{"type": "text" }, "balance":{"type": "float" } } }}POST /user/_doc/{"name":"陳萬祥", "age":12, "sex":true, "loc":"甘肅省武威市", "team":"red", "birth":"1998-01-10", "ip":"192.168.0.3", "country":"china", "habby":["basketball","sing","dance"], "balance":8700.12}POST /user/_doc/{"name":"陳萬祥", "age":122, "sex":true, "loc":"甘肅省武威市", "team":"blue", "birth":"1998-01-10", "ip":"192.168.0.", "country":"france", "habby":["basketball","sing"], "balance":82111}POST /user/_doc/{"name":"勞霞明", "age":21, "sex":true, "loc":"廣西欽州市", "team":"red", "birth":"1997-01-10", "ip":"192.168.3.11", "country":"china", "habby":["swming","dance"], "balance":800.12}POST /user/_doc/{"name":"汪明", "age":24, "sex":false, "loc":"天津市", "team":"green", "birth":"1998-02-10", "ip":"192.165.0.3", "country":"china", "habby":["sing","read"], "balance":9000}POST /user/_doc/{"name":"蔡徐坤", "age":12, "sex":true, "loc":"甘肅省蘭州市", "team":"green", "birth":"1998-03-10", "ip":"192.167.0.0", "country":"france", "habby":["game","eat"], "balance":2300}POST /user/_doc/{"name":"愛英斯坦", "age":45, "sex":true, "loc":"甘肅省張掖市", "team":"blue", "birth":"2003-06-10", "ip":"192.168.0.32", "country":"england", "habby":["basketball","sing","dance"], "balance":6900}POST /user/_doc/{"name":"歐拉", "age":65, "sex":false, "loc":"甘肅省天水市", "team":"blue", "birth":"2021-08-10", "ip":"192.168.6.3", "country":"china", "habby":["basketball","dance"], "balance":4300}POST /user/_doc/{"name":"上帝", "age":22, "sex":false, "loc":"西方世界", "team":"black", "ip":"192.168.3.3", "country":"england", "habby":["eat","game","sing"], "balance":12000.12}GET /user/_doc/_searchGET /user/_doc/_search{"query":{"term":{"name":"陳萬祥" } }, "from":0, "size":10, "sort":[{"age":"desc" }], "highlight":{"fields":{"name":{} } }}#求出user索引的和GET /user/_doc/_search{"aggs":{"user1_sum":{"sum":{"field":"age" } } }}#求出user索引的最大值GET /user/_doc/_search{"size":0, "aggs":{"user1_max":{"max":{"field":"age" } } }}#根據team字段聚合分組、并得到每個分組的求和、最大值、最小值、平均值GET /user/_doc/_search{"size":0, "aggs":{"user1_term":{"terms":{"field":"team" }, "aggs":{"term_sum":{"sum":{"field":"age" } }, "term_max":{"max":{"field":"age" }}, "term_min":{"min":{"field":"age" }}, "term_avg":{"avg":{"field":"age" }} } } }}#查看工資范圍的百分比GET /user/_search{"size": 0, "aggs": {"balance_a": {"percentile_ranks": {"field": "balance", "values": [2000,4000,6000,8000,10000] } } }}#查看一些計數、最小值、最大值、平均值、求和分別是多少GET /user/_search{"size": 0, "aggs": {"balance_a": {"stats": {"field": "balance" } } }}#查看一些其他的指標結果GET /user/_search{"size": 0, "aggs": {"balance_a": {"extended_stats": {"field": "age" } } }}#查看對字段sex的聚合GET /user/_search{"size": 0, "aggs": {"sex_a": {"terms": {"field": "sex" } } }}#聚合并排序GET /user/_search{"size": 0, "aggs": {"sex_a": {"terms": {"field": "team", "order": {"max_a": "desc" } }, "aggs":{"max_a":{"max":{"field": "age" } } } } }}#聚合支持腳本GET /user/_search{"size": 0, "aggs": {"sex_a": {"terms": {"script": "doc["team"].value" } } }}#篩選出包含指定詞語和不包含的GET /user/_search{"size": 0, "aggs": {"term_a": {"terms": {"field": "age", "include": "*.市" } } }}#------------------------------------------------DELETE user3#多字段聚合的實現方式:#1、通過腳本合并字段#2、使用copy_to方法合并兩個字段PUT /user3{"mappings": {"properties": {"name":{"type": "text", "fielddata": true } } }}PUT /user3{"mappings": {"properties": {"name":{"type": "text", "fields": {"keyword":{"type":"keyword" } } } } }}POST /user3/_doc{"name":"hello word"}GET /user3/_search{"query": {"match": {"name": "hello" } }, "aggs":{"testq":{"terms":{"field":"name.keyword" } } }}PUT test3POST test3/stu{"name":"cwx"}POST test3/tes{"name":"lxm"}
五、集群
六、優化
1、聚合為什么慢?
大多數時候對單個字段的聚合查詢還是非??斓模?但是當需要同時聚合多個字段時,就可能會產生大量的分組,最終結果就是占用 es 大量內存,從而導致 OOM 的情況發生。 實踐應用發現,以下情況都會比較慢: 1)待聚合文檔數比較多(千萬、億、十億甚至更多); 2)聚合條件比較復雜(多重條件聚合); 3)全量聚合(翻頁的場景用)。
2、聚合優化方案探討
參考鏈接:https://blog.csdn.net/laoyang360/article/details/79253294
優化方案一:默認深度優先聚合改為廣度優先聚合。
"collect_mode" : "breadth_first"
depth_first 直接進行子聚合的計算 breadth_first 先計算出當前聚合的結果,針對這個結果在對子聚合進行計算。 優化方案二: 每一層terms aggregation內部加一個 “execution_hint”: “map”。
"execution_hint": "map"
Map方式的結論可簡要概括如下: 1)查詢結果直接放入內存中構建map,在查詢結果集小的場景下,速度極快; 2)但如果待結果集合很大的情況,map方式不一定也快。
3、運用 shard_size 來提高 term aggregation 的精度
參考鏈接:https://blog.csdn.net/UbuntuTouch/article/details/104141398
請求的大?。╯ize)越大,結果將越準確,但計算最終結果的成本也將越高(這兩者都是由于在分片級別上管理的優先級隊列更大,并且節點和客戶端之間的數據傳輸也更大)。
shard_size 參數可用于最大程度地減少請求的大小帶來的額外工作。 定義后,它將確定協調節點將從每個分片請求多少個術語。 一旦所有分片都做出響應,協調節點便會將它們縮減為最終結果,該最終結果將基于size參數-這樣一來,可以提高返回條款的準確性,并避免流回大量存儲桶的開銷給客戶。
注意:shard_size 不能小于 size(因為意義不大)。 啟用時,Elasticsearch 將覆蓋它并將其重置為等于大小。
缺省 shard_size為(size* 1.5 + 10)。
Terms aggregation 對于大量數據來說通常是不精確的
我們先來看一下如下的一個圖:
從上面的圖中,在 shard_size 為3的情況下,我們想對 geoip.country_name 這個字段來進行 terms aggregation:
從 shard 0 中提取文檔數靠前的前三個,它們分別是 USA,India 及 France。它們的文檔數分別是5,4及4。 從 shard 1 中提取文檔數靠前的前單個,它們分別是 USA,India 及 Japan。它們的文檔數分別是4,5及3。 那么總的文檔數是:
USA為:5 + 4 = 9India為:4 + 5 = 9France為:4 + 0 = 4Japan為: 3 + 0 = 3
根據上面的計算,返回的結果將會是 USA,India 及 France。細心的開發者可能馬上可以看出來,在上面的統計中國其實是不精確的,這是因為在 shard 0 中,我們可以看見 Japan 有3個文檔沒有被統計進去。這個統計是基于我們對 shard_size 為3的情況。假如我們把 shard_size 提供到4,情況馬上就會不同,而且更加接近我們的實際的統計數據的結果。在這種情況下,Japan 將會有 3 + 6 共6很個文檔,應該是排名第3。
我們可以修改我們的請求如下:
GET logs_server*/_search{ "size": 0, "aggs": { "top_10_urls": { "terms": { "field": "geoip.country_name.keyword", "size": 10, "shard_size": 100 } } }}
我們可以通過增加 shard_size 來提高數據的精確性,但是必須注意的是這樣的代價是計算的成本增加,特別是針對大量數據而言。
標簽:
相關推薦:
精彩放送:
- []世界訊息:三川智慧:截至3月31日,公司股東總數是30,425戶
- []環球觀熱點:青海華鼎:截止2023年3月31日公司股東人數為31900名
- []當前焦點!最牛大賺400%!剛剛 基金公司長期業績榜單來了
- []【全球時快訊】思南人B隊0-3金海綠化 羅志偉取得進球
- []天天熱消息:郵輪出境游重新起航,上海、深圳率先試點恢復
- []全球新動態:厭倦上班的年輕人,辭職開民宿:本以為要虧本,卻意外爆滿
- []即時:哈登帶傷出戰,大帝陷入重圍,76人季后賽敲響警鐘
- []國瑞健康:2022年實現收入33.4億元
- []世界速讀:朗詩綠色管理:2022年歸屬股東凈虧損25.88億元
- []節能鐵漢:公司正在按照相關程序推進以簡易程序向特定對象發行股票事項
- []觀熱點:聚焦IPO | 四月第一周再迎10家新股申購,客戶依賴問題需重點關注
- []全球今熱點:唐人神:公司截至3月31日的股東人數將在2023年一季報中披露,還
- []大地海洋:截至2023年3月31日,公司共有股東3611戶
- []環球微資訊!運機集團:您好投資者,截止3.31公司股東人數為10354戶
- []個人養老金投資最新成績出爐 七成養老FOF跑輸基準
- []估值持續修復 基金一季度業績迎“開門紅”
- []全球快看點丨派息分紅是利好還是利空
- []每日時訊!炒股會虧錢嗎
- []信息:外資機構大舉加倉ETF 新銳基金經理產品成自購熱門
- []美團企業版即將上線;阿里商旅推出因私預訂功能 | 一周商旅動態
- []全球快看點丨國債逆回購周五買幾天合算
- []每日精選:萌翻啦!第十七屆華南(廣州)寵物嘉年華在華農舉行
- []每日速遞:光儲那通事?|?戶用光儲系統,你選對了嗎?
- []全球實時:最快4.8年可回本!光伏巨頭戶用光儲系統經濟性分析
- []環球實時:美股期指什么意思
- []今熱點:投資也有“鄙視鏈”?不怕被“看不起” 這只超級?;鶆撛炝藗髌妫?/a>
- []天天通訊!九安醫療為什么漲這么多
- []【全球新要聞】銀河證券:當前階段銀行板塊估值性價比高 配置價值凸顯
- []環球即時:繳費基數是啥意思,參保人繳納社會保險的基本基數
- []醫無憂保險具體條款
- []兩部門發文要推進的“帶押過戶”到底是什么?
- []【全球時快訊】2022現在車險可以提前多久買,最少30天
- []每日速讀!西安雁塔區推出2宗共148畝商住用地 掛牌截止時間為5月6日
- []“帶押過戶”全面推廣 已有百余城開閘
- []雅居樂獲授23.08億港元及3693.6萬美元定期貸款融資
- []不斷加碼,貝殼累計回購金額近2.3億美金
- []全球焦點!職工醫保余額怎么查詢
- []全球觀焦點:公積金租房提取多久可以申請一次,三個月
- []康師傅方便面:長期穩健經營,多元細分產品塑造競爭優勢
- []在元宇宙里,詠聲動漫正在掀起新生代文化娛樂熱潮
- []在元宇宙里,詠聲動漫正在掀起新生代文化娛樂熱潮
- []當前聚焦:k線怎么看漲跌
- []全球觀點:跌停板吸籌的特征
- []動態:五行火行業比較有前景的行業
- []【全球播資訊】股票市場是什么
- []熱點評!三峽能源股票前景怎么樣
- []【世界速看料】玉米面營養價值及功效_玉米的營養價值及功效與作用
- []世界熱頭條丨中指研究院企業研究總監劉水:前3月重點房企銷售出現正增長
- []世界最資訊丨標榜股份:公司主營業務為汽車尼龍管路及連接件等系列產品的研發、生產和銷售
- []【焦點熱聞】阿里變陣,飛豬“提前開跑”;東呈推出超級IP青貓 | 一周速覽
- []世界聚焦:4月新規來了
- []【環球速看料】閏土股份:截至2023年3月31日,公司的股東人數為37,556
- []天天熱門:鵬華基金經理金笑非:醫藥板塊開啟投資新周期 中國創新藥未來三五年會成為全球高地
- []環球快資訊丨亞朵連續四年盈利;百度仍為攜程最大股東 | 大公司簡報
- []【天天新要聞】新紐科技完成穩中求進 2022年實現收入及凈利潤雙增長
- []首席經濟學家七人談:二季度GDP同比增速或超7% 財政貨幣政策將繼續發力
- []【播資訊】納斯:等賽季結束會花幾周時間考慮去留
- []天天通訊!3月基金發行迎“小陽春” 增量資金等待時機進場
- []熱點在線丨重磅!2022年公募基金年報數據全解!
- []奕東電子:公司的動力電池管理系統FPC根據設計和要求可與各類電池進行適配
- []天天即時:*ST皇臺:待公司2022年年度報告披露后,若符合深交所股票上市規則的相關規定,公司會向深交所提出申請
- []當前速讀:加滿一箱油少花13元!油價迎今年來最大降幅
- []愛仕達:公司暫未涉及鄉村振興相關的業務
- []首批試點!市中醫院入選胃癌規范化診療“國家隊”
- []【環球新視野】德信中國:2022年總收入約人民幣221.45億元
- []全球快播:給寶寶買保險怎么選擇
- []環球微頭條丨公積金第三次貸款條件
- []富力地產:2022年實現收入352億元
- []如何根據身材挑選T恤衫 怎么根據身材挑選T恤衫
- []每日時訊!明發集團:2022年綜合收入約105.684億元
- []環球簡訊:綠地香港:2022年實現收入266.14億元
- []【環球聚看點】通鼎互聯:公司密切關注6G技術發展方向,未來將結合主營業務適時布局相關產品及解決方案
- []當前滾動:支付寶申請失業補助金成功后怎么領取
- []華僑城亞洲:2022年權益持有人應占虧損約19.13億元
- []國壽財是哪個保險公司
- []第三者責任險只賠人不賠車嗎,都賠
- []世界消息!詐騙5萬元能判幾年_5萬元左右最好的車
- []正榮服務:2022年實現收入11.41億元
- []天天視點!灰谷狩獵的三個怪在線觀看_灰谷狩獵的三個怪
- []快看點丨億達中國:2022年收入為人民幣45.32億元
- []播報:市場下行期,融創仍穩步降負債:2022年整體有息負債減少642億
- []【環球新要聞】農業銀行2022年歸母凈利2591.40億 2023年力爭新增縣域貸款超萬億
- []環球信息:合景泰富2022全年按權益合并收入約為人民幣224.62億元
- []全球今日報丨福晟國際:2022年收入約為人民幣17.93億元
- []大悅城地產:2022年物業開發收入同比增長130.6%
- []融信服務:2022年總收益約為人民幣8.76億元
- []每日短訊:本鋼板材:公司會按照季度報告披露要求,在規定時間內披露
- []順絡電子:3月30日公司高管袁金鈺減持公司股份合計321.19萬股
- []消息!港龍中國2022年業績:穩健經營,提質增效
- []環球熱文:遠大中國:2022年收入約人民幣14.71億元
- []每日動態!佳云科技控股股東所持1.35億股股份被司法凍結,持股方為佳兆業商業集團
- []北京市掛牌兩宗住宅用地,總起拍價56.3億元,涉及大興區、豐臺區
- []保利發展2022年報:穿越行業周期波動 企穩高質量發展之路
- []【環球快播報】港龍中國地產:2022年收益約為人民幣118.92億元
- []全球播報:中國三迪:2022年總收入約為人民幣34.49億元
- []天天關注:大悅城地產:2022年實現收入208.31億元
- []中泰證券發布中泰財富與家族信托等金融服務
- []保利發展:3月31日公司高管黃海增持公司股份合計2萬股
- []三立期貨3月31日基差:一張圖盡覽有色金屬、黑色系、能源化工和農產品基差
- []環球觀天下!國銳地產:2022年虧損約3.2億港元
- 解析ElasticSearch ElasticSearch字段類型解析
- 【熱聞】博彩股集體走強 澳門3月博彩毛收入127.38億澳門元
- 【世界時快訊】港股內房股多數上漲 裕田中國漲超8%、中海漲超7%
- 當前滾動:浙江余姚工業園區建設公司4億中票回售 并調整利率至3.50%
- 環球視點!天山鋁業:截止3月31日公司股東人數71783人
- 陽澄湖濱酒店和新江南8.51億元商業ABS更新至“已受理”
- 【全球新要聞】博主探店變“探錢”,消費者避雷變“踩雷”
- 焦點熱文:4月3日限售股解禁一覽(名單)
- 環球今亮點!周口城投10億元私募債項目更新至“已受理”
- 世界快播:金能科技:截至2023年3月31日,公司股東戶數共42007戶
- B站注冊資本增幅400%至5億 目前由陳睿全資持股
- 光源資本出任獨家財務顧問 沐曦集成電路10億元A輪融資宣告完成
- 巨輪智能2021年上半年營收11.24億元 期內研發費用投入增長19.05%
- 紅棗期貨尾盤拉升大漲近6% 目前紅棗市場總庫存約30萬噸
- 嘉銀金科發布2021年Q2財報 期內凈利潤達1.27億元同比增長208%
- 成都銀行2021上半年凈利33.89億元 期內實現營收同比增長17.27億元
- 汽車之家發布2021年第二季度業績 期內新能源汽車品牌收入增長238%
- 中信銀行上半年實現凈利潤290.31億元 期末不良貸款余額706.82億元
- 光伏概念掀起漲停潮交易價格創新高 全天成交額達1.29億元
- 上半年生物藥大增45% 關鍵財務指標好轉營收賬款持續下降
- 新資訊:宋都服務:2022年實現收入2.68億元
- 環球今亮點!榮萬家:2022年歸屬股東凈利潤2.35億元
- 遠洋服務:2022年歸屬股東凈利潤人民幣7540萬元
- 雅化集團:業績預告的發布有相應的規則和時間要求,具體信息您可上網查詢和了解
- 今日訊!ST步森股民索賠時效不足4個月 此前已有獲賠案例
- 世界快消息!買房賣房大消息!"帶押過戶"全國全面推進!北京正式啟動,100多地市已開展
- 維金加德推出了與熱門電視劇維京人合作的第二部分
- 【天天新視野】從可用座位公里,看航空市場過去25年的變化
- 環球焦點!超級IP青貓出道,東呈互聯網化又下一棋
- 焦點熱門:旅行社入境團隊游今起恢復,入境航班搜索熱度增長370%
- 環球聚焦:香港旅游業復蘇推動航空運力增長,但全面恢復并不容易
- 當前滾動:世茂集團:2022年全年業績及2022年年報延遲刊發及寄發
- 全球關注:上坤地產:延遲刊發2022年經審核末期業績
- 財報金選|楊惠妍:在分化市場中尋找確定性
- 羅牛山:各行各業的采購方會對投標企業設立不同情況的資格門檻,要求投標單位具備各種其所需的條件
- 每日關注!云南能投:截至目前公司未收到任何大股東有關減持的通知
- 天天最新:財報金選丨領地控股2022年收益達139.79億元 毛損19.996億元
- 世界要聞:財報金選丨弘陽地產2022年總收入200.13億元 錄得毛利16.66億元
- 全球焦點!國林科技:公司新疆晶體乙醛酸項目采用釜式反應裝置
- 天天即時看!華蘭疫苗:2022年度公司流感疫苗產品的整體毛利率為88.49% 占營業收入的比重為99.56%
- 勇闖元宇宙,這家動漫公司破勢生長
- 讓元宇宙更好玩,詠聲動漫是認真的!
- 讓元宇宙更好玩,詠聲動漫是認真的!
- 煤礦截斷護林水,六旬老漢跪地引關注,誰的鍋?
- 環球看熱訊:浙江溫州:鼓勵新增的海上風電、集中式光伏電站建設或購買新型儲能(服務)
- 快速大爆發的逆變器龍頭,德業股份在光儲行業的逆襲
- 當前關注:580億!海辰儲能獲工商銀行授信!
- 石油行業的春天來了?
- 環球看熱訊:中交地產:擬發行7億元公司債券
- 焦點消息!榮聯科技:公司和英偉達目前沒有業務合作
- 焦點關注:建發房地產:擬發行10億元公司債券
- 【全球新要聞】財報金選丨紅星美凱龍:市場份額持續增長 龍頭地位穩固
- 世界熱門:萬達商管35億元ABS發行計劃獲上交所受理
- 南國置業:公司于2023年情人節期間,在“泛悅甄選”的微信小程序上推出茶葉與紅酒
- 全球微速訊:海昌海洋公園:2022年凈虧損14.08億元
- 中富通:公司按照相關要求在定期報告中披露股東人數
- 環球熱消息:常州養老金交15和交20年有多少差別?(常州的養老保險要交多少)
- “五一”海南掀旅游熱:三亞6000元酒店一房難求,機票大漲游客直呼比國外還貴
- 環球即時:富力地產:預計2022年凈虧損155億元
- 綠城置業10.82億元競得大連東港一宗超3.3萬平米涉宅地塊
- 七座商務車有哪些?七座商務車怎么樣?
- 3月31日西部材料漲停分析:有色 · 鉬,有色 · 鈦,有色 · 鋯概念熱股
- 全球即時:“五個一百”,奮進中國迸發澎湃活力
- 全球熱文:氯堿化工:公司出口貿易在一季度沒有重大變化
- 3月31日三江購物漲停分析:阿里巴巴概念股,新零售概念熱股
- 3月31日倍加潔漲停分析:口腔概念熱股
- 財報金選丨遠洋集團2022年營業額461.27億元 毛利23.77億元
- 【天天時快訊】陸豐烏坎在哪里?陸豐烏坎資料介紹?
- 防腐油漆有什么優點?防腐油漆資料介紹?
- 中海地產:2022年歸屬股東凈利潤232.6億元
- N型組件“四高四低”優勢得到驗證,國電電力天津30MW項目發電增益5.15%
- 3月31日健麾信息漲停分析:醫療信息化概念熱股
- 焦點滾動:vivoy55是全網通手機嗎?vivoy55配置怎么樣?
- 視點!新聞系專業有哪些?與新聞相關的課程有哪些?
- 修改器怎么使用?修改器的使用方法?
- 資訊:深圳首批供地:龍湖6.08億競得龍崗宅地 深振業10.29億元摘下光明區用地
- 今亮點!集美大學航海學院是本科嗎?集美大學航海學院資料介紹?
- 樂寶是什么?樂寶商城APP資料介紹?
- 當前聚焦:盡的多音詞怎么組詞?盡有幾種讀音?
- 【時快訊】如何設置網頁視頻播放器?設置網頁視頻播放器的方法?
- 召喚武俠人物的系統小說有哪些?召喚武俠人物的系統小說大全?
- 天天快訊:楊天真是誰?楊天真個人資料介紹?
- 每日快看:發酵床的材料都有什么?發酵床是干什么的?
- 2020年高速公路收費標準是什么?2020年高速公路收費標準介紹?
- 你的酒館對我打了烊是什么歌?創作背景是什么?
- 天天新資訊:管理學中管理的協調性定義是什么?協調的概念是什么?
- 新年紅包祝福語怎么寫?新年紅包祝福語有哪些?
- 今日熱搜:4月市場以結構性機會為主?六大券商看市:把握三大主線
- 熱訊:華為榮耀5c怎么樣?華為榮耀5c有哪些優缺點?
- 世界熱門:單色儀光譜儀以及攝譜儀有什么區別?單色儀光譜儀以及攝譜儀的區別介紹?
- 環球觀熱點:《最后的生還者》PC版新更新補丁推出 修復Bug優化性能
- 6000元做期貨一年賺一百萬,用6000元入市期貨,一年千萬賺不難
- 世界聚焦:其季父項梁中的季是什么意思?古代兄弟排行稱謂有哪些?
- 正規投資app平臺,正規投資app平臺推薦
- 今日熱訊:股票交易平臺是什么意思,股票交易規則
- 世界新資訊:2萬元股票一進一出手續費,2萬元股票交易真實成本,了解一下手續費影響投資的重要性
- 速讀:投資理財平臺哪個最好,最優投資理財平臺評選
- 【天天新要聞】現場丨譚迎輝:城市動能升級要抓住產業本身和一流人才兩條動線
- 熱門:現場丨陳靂:新老基建、高端制造業、數字經濟將成為托底中國發展的三大引擎
- 全球熱點評!蘇博特:截至2023年3月20日,蘇博特公司股東總數為17219戶
- 【全球報資訊】華潤置地80億元消費基礎設施資產支持ABS已獲受理
- 【新視野】財報金選丨中海發展:2022年營收1803.2億元,于內地新增40幅土地
- 今日快看!北京銀保監局等聯合發文,啟動存量住房交易“帶押過戶”模式
- 年報顯示業績不及預期 新強聯股價下跌超8%
- 田文富:大力傳承弘揚新時代竹林精神,推動河南創新開放“建高地”
- 銀行股票分紅時間
- 【世界快播報】總資產周轉率多少正常
- 世界消息!審計的目標是什么
- 世界今頭條!借款合同印花稅稅率是多少
- 天天簡訊:什么是剛性兌付
- 現場丨圓桌對話:創新聚變,城市更新的道與術
- 現貨黃金交易策略:美元守住關鍵支撐,金價無力繼續沖高?
- 全球通訊!萬科祝九勝:泊寓實現報表盈利的目標不會改變
- 北方稀土:稀土產品的市場價格是由供求關系決定的
- 世界快看點丨匯川技術:公司會在本欄目“公司聲音”處披露股東人數,您可以自行關注
- 【全球熱聞】溫德姆酒店及度假村2022年營收14.98億美元 歸母凈利潤3.55億美元
- 【世界時快訊】林洋能源:公司自持的光伏電站按規定辦理相關手續進行建設
- 股市交易時間內可以隨時買入和賣出嗎
- 全球觀天下!奈雪的茶在南昌成立餐飲管理公司
- 葛蘭隱形重倉股曝光!大幅加倉這些股