{"id":270,"date":"2024-11-23T09:50:56","date_gmt":"2024-11-23T01:50:56","guid":{"rendered":"https:\/\/obagg.com\/index.php\/2024\/11\/23\/elasticsearch%e4%b8%ad%e4%bd%bf%e7%94%a8bucket-script%e8%bf%9b%e8%a1%8c%e8%81%9a%e5%90%88\/"},"modified":"2024-11-23T09:50:56","modified_gmt":"2024-11-23T01:50:56","slug":"elasticsearch%e4%b8%ad%e4%bd%bf%e7%94%a8bucket-script%e8%bf%9b%e8%a1%8c%e8%81%9a%e5%90%88","status":"publish","type":"post","link":"https:\/\/obagg.com\/index.php\/2024\/11\/23\/elasticsearch%e4%b8%ad%e4%bd%bf%e7%94%a8bucket-script%e8%bf%9b%e8%a1%8c%e8%81%9a%e5%90%88\/","title":{"rendered":"elasticsearch\u4e2d\u4f7f\u7528bucket script\u8fdb\u884c\u805a\u5408"},"content":{"rendered":"<h1>1\u3001\u80cc\u666f<\/h1>\n<p>\u6b64\u7bc7\u6587\u6863\u7b80\u5355\u7684\u8bb0\u5f55\u4e00\u4e0b\u5728<code>es<\/code>\u4f7f\u7528<code>bucket script<\/code>\u6765\u8fdb\u884c\u805a\u5408\u7684\u4e00\u4e2a\u4f8b\u5b50\u3002<\/p>\n<h1>2\u3001\u9700\u6c42<\/h1>\n<p>\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a\u7b80\u5355\u7684\u5356\u8f66\u6570\u636e\uff0c\u8bb0\u5f55\u6bcf\u4e2a\u6708<code>month<\/code>\u5728\u5356\u4e86<code>brand<\/code>\u54c1\u724c\u7684\u8f66<code>salesVolume<\/code>\u7684\u6570\u91cf\u3002<br \/>\n\u6b64\u5904\u6211\u4eec\u9700\u8981\u805a\u5408\u51fa  \u6bcf\u4e2a\u6708<code>brand=\u5b9d\u9a6c<\/code>\u7684\u8f66\u5728<code>\u6bcf\u4e2a\u6708<\/code>\u7684<code>\u9500\u552e\u5360\u6bd4<\/code><\/p>\n<h1>3\u3001\u51c6\u5907\u6570\u636e<\/h1>\n<h2>3.1 mapping<\/h2>\n<pre><code>PUT \/index_bucket_script\n{\n  \"mappings\": {\n    \"properties\": {\n      \"month\": {\n        \"type\": \"keyword\"\n      },\n      \"brand\": {\n        \"type\": \"keyword\"\n      },\n      \"salesVolume\": {\n        \"type\": \"integer\"\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<h2>3.2 \u63d2\u5165\u6570\u636e<\/h2>\n<pre><code>PUT \/index_bucket_script\/_bulk\n{\"index\":{\"_id\":1}}\n{\"month\":\"2023-01\",\"brand\":\"\u5b9d\u9a6c\",\"salesVolume\":100}\n{\"index\":{\"_id\":3}}\n{\"month\":\"2023-02\",\"brand\":\"\u5927\u4f17\",\"salesVolume\":80}\n{\"index\":{\"_id\":4}}\n{\"month\":\"2023-02\",\"brand\":\"\u5b9d\u9a6c\",\"salesVolume\":20}\n<\/code><\/pre>\n<p><code>\u6ce8\u610f\uff1a<\/code> \u6b64\u5904<code>2023-02<\/code>\u6708\u4efd\u7684\u6570\u636e\u63d2\u5165\u4e86<code>2<\/code>\u4e2a\u54c1\u724c\u7684\u6570\u636e\u3002<\/p>\n<h1>4\u3001bucket_script\u805a\u5408\u7684\u8bed\u6cd5<\/h1>\n<div class=\"image-package\">\n<div class=\"image-container\" style=\"max-width: 700px; max-height: 754px;\">\n<div class=\"image-view\" data-width=\"1714\" data-height=\"1844\"><img decoding=\"async\" src=\"https:\/\/obagg.com\/wp-content\/uploads\/2024\/11\/frc-f8d93e77cc031a034aac0eb6fd1b2a24.png\"><\/div>\n<\/div>\n<div class=\"image-caption\">bucket_script\u805a\u5408\u7684\u8bed\u6cd5<\/div>\n<\/div>\n<h1>5\u3001\u805a\u5408<\/h1>\n<h2>5.1 \u6839\u636e\u6708\u4efd\u5206\u7ec4\u6392\u5e8f<\/h2>\n<pre><code>GET index_bucket_script\/_search\n{\n  \"query\": {\n    \"match_all\": {}\n  },\n  \"size\": 0,\n  \"aggs\": {\n    \"\u6839\u636e\u6708\u4efd\u5206\u7ec4\": {\n      \"terms\": {\n        \"field\": \"month\",\n        \"order\": {\n          \"_key\": \"asc\"\n        }\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<h2>5.2 \u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u8f86\u8f66<\/h2>\n<pre><code>GET index_bucket_script\/_search\n{\n  \"query\": {\n    \"match_all\": {}\n  },\n  \"size\": 0,\n  \"aggs\": {\n    \"\u6839\u636e\u6708\u4efd\u5206\u7ec4\": {\n      \"terms\": {\n        \"field\": \"month\",\n        \"order\": {\n          \"_key\": \"asc\"\n        }\n      },\n      \"aggs\": {\n        \"\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u8f86\u8f66\": {\n          \"sum\": {\n            \"field\": \"salesVolume\"\n          }\n        }\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<h2>5.3 \u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u5b9d\u9a6c\u8f66<\/h2>\n<pre><code>GET index_bucket_script\/_search\n{\n  \"query\": {\n    \"match_all\": {}\n  },\n  \"size\": 0,\n  \"aggs\": {\n    \"\u6839\u636e\u6708\u4efd\u5206\u7ec4\": {\n      \"terms\": {\n        \"field\": \"month\",\n        \"order\": {\n          \"_key\": \"asc\"\n        }\n      },\n      \"aggs\": {\n        \"\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u8f86\u8f66\": {\n          \"sum\": {\n            \"field\": \"salesVolume\"\n          }\n        },\n        \"\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u5b9d\u9a6c\u8f66\": {\n          \"filter\": {\n            \"term\": {\n              \"brand\": \"\u5b9d\u9a6c\"\n            }\n          },\n          \"aggs\": {\n            \"\u6bcf\u4e2a\u6708\u5356\u51fa\u7684\u5b9d\u9a6c\u8f66\u8f86\u6570\": {\n              \"sum\": {\n                \"field\": \"salesVolume\"\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<h2>5.4 \u6bcf\u4e2a\u6708\u5b9d\u9a6c\u8f66\u9500\u552e\u5360\u6bd4<\/h2>\n<h3>5.4.1 dsl<\/h3>\n<pre><code>GET index_bucket_script\/_search\n{\n  \"query\": {\n    \"match_all\": {}\n  },\n  \"size\": 0,\n  \"aggs\": {\n    \"\u6839\u636e\u6708\u4efd\u5206\u7ec4\": {\n      \"terms\": {\n        \"field\": \"month\",\n        \"order\": {\n          \"_key\": \"asc\"\n        }\n      },\n      \"aggs\": {\n        \"\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u8f86\u8f66\": {\n          \"sum\": {\n            \"field\": \"salesVolume\"\n          }\n        },\n        \"\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u5b9d\u9a6c\u8f66\": {\n          \"filter\": {\n            \"term\": {\n              \"brand\": \"\u5b9d\u9a6c\"\n            }\n          },\n          \"aggs\": {\n            \"\u6bcf\u4e2a\u6708\u5356\u51fa\u7684\u5b9d\u9a6c\u8f66\u8f86\u6570\": {\n              \"sum\": {\n                \"field\": \"salesVolume\"\n              }\n            }\n          }\n        },\n        \"\u6bcf\u4e2a\u6708\u5b9d\u9a6c\u8f66\u9500\u552e\u5360\u6bd4\": {\n          \"bucket_script\": {\n            \"buckets_path\": {\n              \"fenzi\": \"\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u5b9d\u9a6c\u8f66 &gt; \u6bcf\u4e2a\u6708\u5356\u51fa\u7684\u5b9d\u9a6c\u8f66\u8f86\u6570\",\n              \"fenmu\": \"\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u8f86\u8f66\"\n            },\n            \"script\": \"params.fenzi \/ params.fenmu * 100\"\n          }\n        }\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<h3>5.4.2 java<\/h3>\n<pre><code class=\"java\">@Test\n@DisplayName(\"\u7edf\u8ba1\u5b9d\u9a6c\u8f66\u6bcf\u4e2a\u6708\u9500\u552e\u7387\")\npublic void test01() throws IOException {\n    SearchRequest request = SearchRequest.of(searchRequest -&gt;\n            searchRequest.index(INDEX_PERSON)\n                    .query(query -&gt; query.matchAll(matchAll -&gt; matchAll))\n                    .size(0)\n                    .aggregations(\"\u6839\u636e\u6708\u4efd\u5206\u7ec4\", monthAggr -&gt;\n                            monthAggr.terms(terms -&gt; terms.field(\"month\").order(\n                                    NamedValue.of(\"_key\", SortOrder.Asc)\n                            ))\n                            .aggregations(\"\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u8f86\u8f66\", agg1 -&gt;\n                                    agg1.sum(sum -&gt; sum.field(\"salesVolume\"))\n                            )\n                            .aggregations(\"\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u5b9d\u9a6c\u8f66\", agg2 -&gt;\n                                    agg2.filter(filter -&gt; filter.term(term -&gt; term.field(\"brand\").value(\"\u5b9d\u9a6c\")))\n                                            .aggregations(\"\u6bcf\u4e2a\u6708\u5356\u51fa\u7684\u5b9d\u9a6c\u8f66\u8f86\u6570\", agg3 -&gt;\n                                                    agg3.sum(sum -&gt; sum.field(\"salesVolume\"))\n                                            )\n                            )\n                            .aggregations(\"\u6bcf\u4e2a\u6708\u5b9d\u9a6c\u8f66\u9500\u552e\u5360\u6bd4\", rateAggr -&gt;\n                                    rateAggr.bucketScript(bucketScript -&gt;\n                                            bucketScript.bucketsPath(path -&gt;\n                                                            path.dict(\n                                                                    new HashMap<string string>() {\n                                                                        {\n                                                                            put(\"fenzi\", \"\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u5b9d\u9a6c\u8f66&gt;\u6bcf\u4e2a\u6708\u5356\u51fa\u7684\u5b9d\u9a6c\u8f66\u8f86\u6570\");\n                                                                            put(\"fenmu\", \"\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u8f86\u8f66\");\n                                                                        }\n                                                                    }\n                                                            )\n\n                                                    )\n                                                    .script(script -&gt;\n                                                            script.inline(inline -&gt; inline.source(\"params.fenzi\/params.fenmu\"))\n                                                    )\n                                                    .format(\"#%\")\n                                    )\n                            )\n                    )\n    );\n    System.out.println(\"request: \" + request);\n    SearchResponse<string> response = client.search(request, String.class);\n    System.out.println(\"response: \" + response);\n}\n<\/string><\/string><\/code><\/pre>\n<h3>5.4.3 \u8fd0\u884c\u7ed3\u679c<\/h3>\n<div class=\"image-package\">\n<div class=\"image-container\" style=\"max-width: 700px; max-height: 462px;\">\n<div class=\"image-view\" data-width=\"2384\" data-height=\"1572\"><img decoding=\"async\" src=\"https:\/\/obagg.com\/wp-content\/uploads\/2024\/11\/frc-3f574bd5814cc4c960d7d4580c987476.png\"><\/div>\n<\/div>\n<div class=\"image-caption\">\u8fd0\u884c\u7ed3\u679c<\/div>\n<\/div>\n<h1>5\u3001\u5b8c\u6574\u4ee3\u7801<\/h1>\n<p>https:\/\/gitee.com\/huan1993\/spring-cloud-parent\/blob\/master\/es\/es8-api\/src\/main\/java\/com\/huan\/es8\/aggregations\/pipeline\/BucketScript\u7edf\u8ba1\u5b9d\u9a6c\u8f66\u6bcf\u4e2a\u6708\u9500\u552e\u7387.java<\/p>\n<h1>6\u3001\u53c2\u8003\u6587\u6863<\/h1>\n<p>1\u3001https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/current\/search-aggregations-pipeline.html#buckets-path-syntax  <br \/>\n2\u3001https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/current\/search-aggregations-pipeline-bucket-script-aggregation.html  <br \/>\n3\u3001https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.base\/java\/text\/DecimalFormat.html<\/p>\n<p>Please credit: <a href=\"https:\/\/obagg.com\">OBA Blog<\/a> &raquo; <a href=\"https:\/\/obagg.com\/index.php\/2024\/11\/23\/elasticsearch%e4%b8%ad%e4%bd%bf%e7%94%a8bucket-script%e8%bf%9b%e8%a1%8c%e8%81%9a%e5%90%88\/\">elasticsearch\u4e2d\u4f7f\u7528bucket script\u8fdb\u884c\u805a\u5408<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>1\u3001\u80cc\u666f \u6b64\u7bc7\u6587\u6863\u7b80\u5355\u7684\u8bb0\u5f55\u4e00\u4e0b\u5728es\u4f7f\u7528bucket script\u6765\u8fdb\u884c\u805a\u5408\u7684\u4e00\u4e2a\u4f8b\u5b50\u3002 2\u3001\u9700\u6c42 \u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a\u7b80\u5355\u7684\u5356\u8f66\u6570\u636e\uff0c\u8bb0\u5f55\u6bcf\u4e2a\u6708month\u5728\u5356\u4e86brand\u54c1\u724c\u7684\u8f66salesVolume\u7684\u6570\u91cf\u3002 \u6b64\u5904\u6211\u4eec\u9700\u8981\u805a\u5408\u51fa \u6bcf\u4e2a\u6708brand=\u5b9d\u9a6c\u7684\u8f66\u5728\u6bcf\u4e2a\u6708\u7684\u9500\u552e\u5360\u6bd4 3\u3001\u51c6\u5907\u6570\u636e 3.1 mapping PUT \/index_bucket_script { &#8220;mappings&#8221;: { &#8220;properties&#8221;: { &#8220;month&#8221;: { &#8220;type&#8221;: &#8220;keyword&#8221; }, &#8220;brand&#8221;: { &#8220;type&#8221;: &#8220;keyword&#8221; }, &#8220;salesVolume&#8221;: { &#8220;type&#8221;: &#8220;integer&#8221; } } } } 3.2 \u63d2\u5165\u6570\u636e PUT \/index_bucket_script\/_bulk {&#8220;index&#8221;:{&#8220;_id&#8221;:1}} {&#8220;month&#8221;:&#8221;2023-01&#8243;,&#8221;brand&#8221;:&#8221;\u5b9d\u9a6c&#8221;,&#8221;salesVolume&#8221;:100} {&#8220;index&#8221;:{&#8220;_id&#8221;:3}} {&#8220;month&#8221;:&#8221;2023-02&#8243;,&#8221;brand&#8221;:&#8221;\u5927\u4f17&#8221;,&#8221;salesVolume&#8221;:80} {&#8220;index&#8221;:{&#8220;_id&#8221;:4}} {&#8220;month&#8221;:&#8221;2023-02&#8243;,&#8221;brand&#8221;:&#8221;\u5b9d\u9a6c&#8221;,&#8221;salesVolume&#8221;:20} \u6ce8\u610f\uff1a \u6b64\u59042023-02\u6708\u4efd\u7684\u6570\u636e\u63d2\u5165\u4e862\u4e2a\u54c1\u724c\u7684\u6570\u636e\u3002 4\u3001bucket_script\u805a\u5408\u7684\u8bed\u6cd5 bucket_script\u805a\u5408\u7684\u8bed\u6cd5 5\u3001\u805a\u5408 5.1 \u6839\u636e\u6708\u4efd\u5206\u7ec4\u6392\u5e8f GET index_bucket_script\/_search { &#8220;query&#8221;: { &#8220;match_all&#8221;: {} }, &#8220;size&#8221;: 0, &#8220;aggs&#8221;: { &#8220;\u6839\u636e\u6708\u4efd\u5206\u7ec4&#8221;: { &#8220;terms&#8221;: { &#8220;field&#8221;: &#8220;month&#8221;, &#8220;order&#8221;: { &#8220;_key&#8221;: &#8220;asc&#8221; } } } } } 5.2 \u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u8f86\u8f66 GET index_bucket_script\/_search { &#8220;query&#8221;: { &#8220;match_all&#8221;: {} }, &#8220;size&#8221;: 0, &#8220;aggs&#8221;: { &#8220;\u6839\u636e\u6708\u4efd\u5206\u7ec4&#8221;: { &#8220;terms&#8221;: { &#8220;field&#8221;: &#8220;month&#8221;, &#8220;order&#8221;: { &#8220;_key&#8221;: &#8220;asc&#8221; } }, &#8220;aggs&#8221;: { &#8220;\u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u8f86\u8f66&#8221;: { &#8220;sum&#8221;: { &#8220;field&#8221;: &#8220;salesVolume&#8221; } } } } } } 5.3 \u7edf\u8ba1\u6bcf\u4e2a\u6708\u5356\u4e86\u591a\u5c11\u5b9d\u9a6c\u8f66 GET index_bucket_script\/_search { &#8220;query&#8221;: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-270","post","type-post","status-publish","format-standard","hentry","category-share"],"_links":{"self":[{"href":"https:\/\/obagg.com\/index.php\/wp-json\/wp\/v2\/posts\/270","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/obagg.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/obagg.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/obagg.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/obagg.com\/index.php\/wp-json\/wp\/v2\/comments?post=270"}],"version-history":[{"count":0,"href":"https:\/\/obagg.com\/index.php\/wp-json\/wp\/v2\/posts\/270\/revisions"}],"wp:attachment":[{"href":"https:\/\/obagg.com\/index.php\/wp-json\/wp\/v2\/media?parent=270"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/obagg.com\/index.php\/wp-json\/wp\/v2\/categories?post=270"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/obagg.com\/index.php\/wp-json\/wp\/v2\/tags?post=270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}