{"id":560,"date":"2018-10-17T17:57:39","date_gmt":"2018-10-17T08:57:39","guid":{"rendered":"https:\/\/dong1lkim.oboki.net\/?p=560"},"modified":"2019-09-01T22:20:24","modified_gmt":"2019-09-01T13:20:24","slug":"elasticsearch-search-api","status":"publish","type":"post","link":"https:\/\/oboki.net\/workspace\/data-engineering\/elasticsearch\/elasticsearch-search-api\/","title":{"rendered":"[ElasticSearch] Search API"},"content":{"rendered":"<h1>ElasticSearch Search API<\/h1>\n<p>\ud544\ud130 \ub4f1 \uae30\ubcf8\uc801\uc778 \uac80\uc0c9 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc18c\uac1c. RDBMS \uc5d0\uc11c \ucffc\ub9ac\ud55c \uac83\uacfc \ube44\uad50\ud574\ubcf4\uba74\uc11c ElasticSearch\uc5d0\uc11c \ucffc\ub9ac\ud574\ubcf4\uba74 \uc88b\uc744\ub4ef. Query client \ub294 Kibana Dev Tools \uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n<h2>\ud14c\uc2a4\ud2b8 \ub370\uc774\ud130<\/h2>\n<p>tpc-H \uc5d0\uc11c \uc0dd\uc131\ub41c \ub370\uc774\ud130 \uc911 supplier \ud14c\uc774\ube14 \ub370\uc774\ud130\ub97c \ubc14\ud0d5\uc73c\ub85c \ud14c\uc2a4\ud2b8 \uc9c4\ud589.<\/p>\n<h3>supplier index template<\/h3>\n<p>\uc815\uc218\ud615, \ubb38\uc790\ud615, \ud14d\uc2a4\ud2b8 \ud615\uc5d0 \ub530\ub77c \uac80\uc0c9 \ud2b9\uc131\uc744 \ubcf4\uae30 \uc704\ud574 \uc544\ub798\uc640 \uac19\uc774 index template \uc744 \uba3c\uc800 \uc0dd\uc131\ud55c\ub2e4.<\/p>\n<pre><code class=\"json\">curl -X PUT \"node7.dat:9200\/_template\/template_supplier?pretty\" -H 'Content-Type: application\/json' -d'\n{\n  \"template\" : \"supplier*\",\n  \"mappings\" : {\n    \"doc\": {\n      \"properties\": {\n        \"s_suppkey\": {\n          \"type\": \"long\"\n        },\n        \"s_name\": {\n          \"type\": \"keyword\"\n        },\n        \"s_address\": {\n          \"type\": \"text\"\n        },\n        \"s_nationkey\": {\n          \"type\": \"integer\"\n        },\n        \"s_phone\": {\n          \"type\": \"keyword\"\n        },\n        \"s_accbal\": {\n          \"type\": \"double\"\n        },\n        \"s_comment\": {\n          \"type\": \"text\"\n        },\n        \"timestamp\": {\n          \"type\": \"date\",\n          \"format\": \"yyyy-MM-dd HH:mm:ss\"\n        }\n      }\n    }\n  },  \n  \"settings\": {\n    \"number_of_shards\": 6,\n    \"number_of_replicas\": \"0\",\n    \"refresh_interval\": \"120s\"\n  }\n}\n'\n<\/code><\/pre>\n<h3>\ub370\uc774\ud130 \uc778\ub371\uc2f1<\/h3>\n<p>\uc544\ub798 \ud30c\uc77c\uc744 \ub0b4\ub824\ubc1b\uc544\uc11c<\/p>\n<p><a href=\"http:\/\/192.168.179.94\/wp-content\/uploads\/2018\/10\/supplier.data_.tar.gz\"><code>supplier.data.tar.gz<\/code><\/a><\/p>\n<pre><code class=\"gz\">supplier\/\nsupplier\/supplier.tbl.1\nsupplier\/supplier.tbl.10\nsupplier\/supplier.tbl.11\nsupplier\/supplier.tbl.12\nsupplier\/supplier.tbl.13\nsupplier\/supplier.tbl.14\nsupplier\/supplier.tbl.15\nsupplier\/supplier.tbl.16\nsupplier\/supplier.tbl.2\nsupplier\/supplier.tbl.3\nsupplier\/supplier.tbl.4\nsupplier\/supplier.tbl.5\nsupplier\/supplier.tbl.6\nsupplier\/supplier.tbl.7\nsupplier\/supplier.tbl.8\nsupplier\/supplier.tbl.9\nsupplier\/supplier.template.sh\nsupplier\/supplier.post.sh\nsupplier\/supplier.meta\nsupplier\/supplier.post.log\nes_bulk.py\n<\/code><\/pre>\n<p><code>supplier.post.sh<\/code> \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\ud589\ud558\uc5ec \ucd08\uae30 \ub370\uc774\ud130\ub97c \uc778\ub371\uc2f1\ud560 \uc218 \uc788\ub2e4.<\/p>\n<h2>\uac80\uc0c9<\/h2>\n<h3>\ud544\ub4dc \uc120\ud0dd<\/h3>\n<ul>\n<li>SQL<\/li>\n<\/ul>\n<pre><code class=\"sql\">select s_name,s_address from supplier\n<\/code><\/pre>\n<ul>\n<li>DSL<\/li>\n<\/ul>\n<pre><code class=\"json\">GET \/supplier\/_search\n{\n  \"query\": { \"match_all\": {} },\n  \"_source\": [\"s_name\", \"s_address\"]\n}\n<\/code><\/pre>\n<h3>match<\/h3>\n<blockquote><p>\n  \uac80\uc0c9 \ub300\uc0c1 \ud544\ub4dc\uac00 \uc22b\uc790\uc778 \uacbd\uc6b0\n<\/p><\/blockquote>\n<ul>\n<li>SQL<\/li>\n<\/ul>\n<pre><code class=\"sql\">select * from supplier\nwhere s_suppkey = 20\n<\/code><\/pre>\n<ul>\n<li>DSL<\/li>\n<\/ul>\n<pre><code class=\"json\">GET \/supplier\/_search\n{\n  \"query\": { \"match\": { \"s_suppkey\": 20 } }\n}\n<\/code><\/pre>\n<blockquote><p>\n  \uac80\uc0c9 \ub300\uc0c1 \ud544\ub4dc\uac00 Keyword\uc778 \uacbd\uc6b0\n<\/p><\/blockquote>\n<ul>\n<li>SQL<\/li>\n<\/ul>\n<pre><code class=\"sql\">select * from supplier\nwhere s_phone = '31-720-790-5245'\n<\/code><\/pre>\n<ul>\n<li>DSL<\/li>\n<\/ul>\n<pre><code class=\"json\">GET \/supplier\/_search\n{\n  \"query\": { \"match\": { \"s_phone\": \"31-720-790-5245\" } }\n}\n<\/code><\/pre>\n<blockquote><p>\n  \uac80\uc0c9 \ub300\uc0c1 \ud544\ub4dc\uac00 Text\uc778 \uacbd\uc6b0\n<\/p><\/blockquote>\n<p>\uc774\ub7ec\ud55c \uac80\uc0c9\uc5d0\uc11c ElasticSearch \uc758 \uac15\uc810\uc774 \ub098\ud0c0\ub098\ub294\ub370, \uac80\uc0c9 \uc870\uac74 text\ub97c analyze \ud558\uc5ec \ub098\uc628 \uacb0\uacfc term \ub4e4\uc744 \uc774\uc6a9\ud558\uc5ec \uac80\uc0c9\uc744 \uc218\ud589\ud55c\ub2e4. ElasticSearch\uc5d0\uc11c text field\uc5d0 \ub300\ud574 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc7a5\uc744 \uac80\uc0c9\ud558\uba74<\/p>\n<blockquote><p>\n  &#8220;instructions integrate sometimes slyly pending instructions&#8221;,\n<\/p><\/blockquote>\n<p>SQL\ub85c \ud45c\ud604\ud588\uc744 \ub54c\ub294 like \ud544\ud130\ub97c \uc5ec\ub7ec\uac1c \ubb36\uc740\uac83 \uacfc \uac19\ub2e4.<\/p>\n<ul>\n<li>SQL<\/li>\n<\/ul>\n<pre><code class=\"sql\">select * from supplier\nwhere s_address like '%instructions%'\n    and s_address like '%integrate%'\n    and s_address like '%sometimes%'\n    and s_address like '%slyly%'\n    and s_address like '%pending%'\n<\/code><\/pre>\n<ul>\n<li>DSL<\/li>\n<\/ul>\n<pre><code class=\"json\">GET \/supplier\/_search\n{\n  \"query\": {\n      \"match\": {\n          \"s_comment\": {\n            \"query\": \"instructions integrate sometimes slyly pending instructions\",\n            \"operator\": \"and\"\n            }\n        }\n    }\n}\n<\/code><\/pre>\n<h3>range<\/h3>\n<ul>\n<li>SQL<\/li>\n<\/ul>\n<pre><code class=\"sql\">select * from supplier\nwhere s_suppkey &gt;= 20\nand s_suppkey &lt; 40\n<\/code><\/pre>\n<ul>\n<li>DSL<\/li>\n<\/ul>\n<pre><code class=\"json\">GET \/supplier\/_search\n{\n    \"query\": {\n        \"bool\": {\n            \"must\": [\n                {\n                    \"range\": {\n                        \"s_suppkey\": {\n                            \"gte\": \"20\",\n                            \"lt\": \"40\"\n                        }\n                    }\n                }\n            ]\n        }\n    }\n}\n<\/code><\/pre>\n<h3>\ub2e4\uc911 \uc870\uac74<\/h3>\n<h4>Bool Query<\/h4>\n<p>\uc791\uc740 \ucffc\ub9ac\ub4e4\uc744 \ubb36\uc5b4\uc11c \ud070 \ucffc\ub9ac\ub85c \ub9cc\ub4e4\uc5b4\ub0bc \uc218 \uc788\ub2e4.<\/p>\n<h5>bool-must<\/h5>\n<p>must \ub97c \uc774\uc6a9\ud588\uc744 \ub54c\uc5d0\ub294 \ud558\uc704 \uc870\uac74\ub4e4\uc774 \ubaa8\ub450 \uc77c\uce58(and \uc5f0\uc0b0)\ud574\uc57c\ub9cc \ud55c\ub2e4.<\/p>\n<ul>\n<li>SQL<\/li>\n<\/ul>\n<pre><code class=\"sql\">select * from supplier\nwhere s_suppkey &gt;= 20\n    and s_suppkey &lt; 40\n    and s_address like '%ssetugTcXc096qlD7%'\n<\/code><\/pre>\n<ul>\n<li>DSL<\/li>\n<\/ul>\n<pre><code class=\"json\">GET \/supplier\/_search\n{\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        { \"range\": { \"s_suppkey\": {\n                \"gte\": \"20\",\n                \"lt\": \"40\"\n            }}},\n        { \"match\": { \"s_address\": \"ssetugTcXc096qlD7\" } }\n      ]\n    }\n  }\n}\n<\/code><\/pre>\n<h5>bool-should<\/h5>\n<p>should \ub97c \uc0ac\uc6a9\ud558\uba74 \uc544\ub798 \uc870\uac74\ub4e4\uc774 or \uc5f0\uc0b0\uc73c\ub85c \ubb36\uc778\ub2e4.<\/p>\n<ul>\n<li>DSL<\/li>\n<\/ul>\n<pre><code class=\"json\">GET \/supplier\/_search\n{\n  \"query\": {\n    \"bool\": {\n      \"should\": [\n        { \"range\": { \"s_suppkey\": {\n                \"gte\": \"20\",\n                \"lt\": \"40\"\n            }}},\n        { \"match\": { \"s_address\": \"ssetugTcXc096qlD7\" } }\n      ]\n    }\n  }\n}\n<\/code><\/pre>\n<h5>bool-must_not<\/h5>\n<ul>\n<li>SQL<\/li>\n<\/ul>\n<pre><code class=\"sql\">select * from supplier\nwhere s_suppkey &gt;= 20\n    and s_suppkey &lt; 40\n    and s_address not like '%ssetugTcXc096qlD7%'\n<\/code><\/pre>\n<ul>\n<li>DSL<\/li>\n<\/ul>\n<pre><code class=\"json\">GET \/supplier\/_search\n{\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        { \"range\": { \"s_suppkey\": {\n                \"gte\": \"20\",\n                \"lt\": \"40\"\n            }}}],\n      \"must_not\": [\n        { \"match\": { \"s_address\": \"ssetugTcXc096qlD7\" } }]\n    }\n  }\n}\n<\/code><\/pre>\n<h3>aggr<\/h3>\n<ul>\n<li>SQL<\/li>\n<\/ul>\n<pre><code class=\"sql\">select s_nationkey\n    , avg(s_acctbal)\n    , count(s_suppkey)\n    , min(s_suppkey)\n    , max(s_suppkey)\n    , avg(s_suppkey)\n    , sum(s_suppkey)\nfrom supplier\nwhere s_suppkey &lt;= 10000\ngroup by s_nationkey\n<\/code><\/pre>\n<ul>\n<li>DSL<\/li>\n<\/ul>\n<pre><code class=\"json\">GET supplier\/_search\n{\n  \"size\": 0,\n  \"query\": {\n    \"range\": {\n      \"s_suppkey\": {\n        \"from\": null,\n        \"to\": \"10000\",\n        \"include_lower\": false,\n        \"include_upper\": true,\n        \"boost\": 1\n      }\n    }\n  },\n  \"_source\": false,\n  \"stored_fields\": \"_none_\",\n  \"aggregations\": {\n    \"groupby\": {\n      \"composite\": {\n        \"size\": 1000,\n        \"sources\": [\n          {\n            \"s_nationkey\": {\n              \"terms\": {\n                \"field\": \"s_nationkey\",\n                \"missing_bucket\": false,\n                \"order\": \"asc\"\n              }\n            }\n          }\n        ]\n      },\n      \"aggregations\": {\n        \"acctbal_avg\": {\n          \"avg\": {\n            \"field\": \"s_acctbal\"\n          }\n        },\n        \"suppkey_stats\": {\n          \"stats\": {\n            \"field\": \"s_suppkey\"\n          }\n        }\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<p>aggregations.stats \ub97c \ud638\ucd9c\ud558\uba74 count,min,max,avg,sum \uc744 \ubaa8\ub450 \ub358\uc838\uc900\ub2e4.<\/p>\n<h3>script<\/h3>\n<p>\uc55e\uc120 aggregation \ucffc\ub9ac\uc5d0\uc11c \ub098\uc544\uac00 <code>sum( (1-field_A) * field_B )<\/code> \uac12\uc744 \uad6c\ud558\uae30 \uc704\ud574\uc11c\ub294 script \ub97c \uc774\uc6a9\ud558\uba74 \ub41c\ub2e4.<\/p>\n<p>nested operation (?) \uc5d0 \ub300\ud55c \uc880 \ub354 \uc9c1\uad00\uc801\uc778 \ucffc\ub9ac\uac00 \uc788\uc73c\uba74 \uadf8\uac78 \uc368\ubd10\uc57c\ud560 \uac83 \uac19\uc740\ub370 script \ubc16\uc5d0 \ubabb \ucc3e\uc74c.<\/p>\n<ul>\n<li>SQL<\/li>\n<\/ul>\n<pre><code class=\"sql\">select s_nationkey\n    , sum((1-s_acctbal)*s_suppkey)\nfrom supplier\nwhere s_suppkey &lt;= 10000\ngroup by s_nationkey\n<\/code><\/pre>\n<ul>\n<li>DSL<\/li>\n<\/ul>\n<pre><code class=\"json\">GET supplier\/_search\n{\n  \"size\": 0,\n  \"query\": {\n    \"range\": {\n      \"s_suppkey\": {\n        \"from\": null,\n        \"to\": \"10000\",\n        \"include_lower\": false,\n        \"include_upper\": true,\n        \"boost\": 1\n      }\n    }\n  },\n  \"_source\": false,\n  \"stored_fields\": \"_none_\",\n  \"aggregations\": {\n    \"groupby\": {\n      \"composite\": {\n        \"size\": 1000,\n        \"sources\": [\n          {\n            \"s_nationkey\": {\n              \"terms\": {\n                \"field\": \"s_nationkey\",\n                \"missing_bucket\": false,\n                \"order\": \"asc\"\n              }\n            }\n          }\n        ]\n      },\n      \"aggregations\": {\n        \"something\": {\n          \"sum\": {\n            \"script\": \"doc['s_suppkey'].value * ( 1 - doc['s_acctbal'].value )\"\n          }\n        }\n      }\n    }\n  }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>ElasticSearch Search API \ud544\ud130 \ub4f1 \uae30\ubcf8\uc801\uc778 \uac80\uc0c9 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc18c\uac1c. RDBMS \uc5d0\uc11c \ucffc\ub9ac\ud55c \uac83\uacfc \ube44\uad50\ud574\ubcf4\uba74\uc11c ElasticSearch\uc5d0\uc11c \ucffc\ub9ac\ud574\ubcf4\uba74 \uc88b\uc744\ub4ef. Query client \ub294 Kibana Dev Tools \uc744 \uc0ac\uc6a9\ud55c\ub2e4. \ud14c\uc2a4\ud2b8 \ub370\uc774\ud130 tpc-H \uc5d0\uc11c \uc0dd\uc131\ub41c \ub370\uc774\ud130 \uc911 supplier \ud14c\uc774\ube14 \ub370\uc774\ud130\ub97c \ubc14\ud0d5\uc73c\ub85c \ud14c\uc2a4\ud2b8 \uc9c4\ud589. supplier index template \uc815\uc218\ud615, \ubb38\uc790\ud615, \ud14d\uc2a4\ud2b8 \ud615\uc5d0 \ub530\ub77c \uac80\uc0c9 \ud2b9\uc131\uc744 \ubcf4\uae30 \uc704\ud574 \uc544\ub798\uc640 \uac19\uc774 index template [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[25,26],"class_list":["post-560","post","type-post","status-publish","format-standard","hentry","category-elasticsearch","tag-elasticsearch","tag-query"],"_links":{"self":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts\/560","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/comments?post=560"}],"version-history":[{"count":3,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts\/560\/revisions"}],"predecessor-version":[{"id":1206,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts\/560\/revisions\/1206"}],"wp:attachment":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/media?parent=560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/categories?post=560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/tags?post=560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}