"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[6690],{95788:(e,t,r)=>{r.d(t,{Iu:()=>p,yg:()=>h});var n=r(11504);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(r),y=a,h=u["".concat(l,".").concat(y)]||u[y]||d[y]||s;return r?n.createElement(h,o(o({ref:t},p),{},{components:r})):n.createElement(h,o({ref:t},p))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,o=new Array(s);o[0]=y;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:a,o[1]=i;for(var c=2;c<s;c++)o[c]=r[c];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}y.displayName="MDXCreateElement"},66072:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var n=r(45072),a=(r(11504),r(95788));const s={title:"Elasticsearch",hide_title:!0,sidebar_position:18,version:1},o=void 0,i={unversionedId:"databases/elasticsearch",id:"databases/elasticsearch",title:"Elasticsearch",description:"Elasticsearch",source:"@site/docs/databases/elasticsearch.mdx",sourceDirName:"databases",slug:"/databases/elasticsearch",permalink:"/docs/databases/elasticsearch",draft:!1,editUrl:"https://github.com/apache/superset/edit/master/docs/docs/databases/elasticsearch.mdx",tags:[],version:"current",sidebarPosition:18,frontMatter:{title:"Elasticsearch",hide_title:!0,sidebar_position:18,version:1},sidebar:"tutorialSidebar",previous:{title:"Dremio",permalink:"/docs/databases/dremio"},next:{title:"Exasol",permalink:"/docs/databases/exasol"}},l={},c=[{value:"Elasticsearch",id:"elasticsearch",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.yg)(u,(0,n.c)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"elasticsearch"},"Elasticsearch"),(0,a.yg)("p",null,"The recommended connector library for Elasticsearch is\n",(0,a.yg)("a",{parentName:"p",href:"https://github.com/preset-io/elasticsearch-dbapi"},"elasticsearch-dbapi"),"."),(0,a.yg)("p",null,"The connection string for Elasticsearch looks like this:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"elasticsearch+http://{user}:{password}@{host}:9200/\n")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Using HTTPS")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"elasticsearch+https://{user}:{password}@{host}:9200/\n")),(0,a.yg)("p",null,"Elasticsearch as a default limit of 10000 rows, so you can increase this limit on your cluster or\nset Superset\u2019s row limit on config"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"ROW_LIMIT = 10000\n")),(0,a.yg)("p",null,"You can query multiple indices on SQL Lab for example"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'SELECT timestamp, agent FROM "logstash"\n')),(0,a.yg)("p",null,"But, to use visualizations for multiple indices you need to create an alias index on your cluster"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'POST /_aliases\n{\n    "actions" : [\n        { "add" : { "index" : "logstash-**", "alias" : "logstash_all" } }\n    ]\n}\n')),(0,a.yg)("p",null,"Then register your table with the alias name logstash_all"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Time zone")),(0,a.yg)("p",null,"By default, Superset uses UTC time zone for elasticsearch query. If you need to specify a time zone,\nplease edit your Database and enter the settings of your specified time zone in the Other > ENGINE PARAMETERS:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'{\n    "connect_args": {\n        "time_zone": "Asia/Shanghai"\n    }\n}\n')),(0,a.yg)("p",null,"Another issue to note about the time zone problem is that before elasticsearch7.8, if you want to convert a string into a ",(0,a.yg)("inlineCode",{parentName:"p"},"DATETIME")," object,\nyou need to use the ",(0,a.yg)("inlineCode",{parentName:"p"},"CAST")," function,but this function does not support our ",(0,a.yg)("inlineCode",{parentName:"p"},"time_zone")," setting. So it is recommended to upgrade to the version after elasticsearch7.8.\nAfter elasticsearch7.8, you can use the ",(0,a.yg)("inlineCode",{parentName:"p"},"DATETIME_PARSE")," function to solve this problem.\nThe DATETIME_PARSE function is to support our ",(0,a.yg)("inlineCode",{parentName:"p"},"time_zone")," setting, and here you need to fill in your elasticsearch version number in the Other > VERSION setting.\nthe superset will use the ",(0,a.yg)("inlineCode",{parentName:"p"},"DATETIME_PARSE")," function for conversion."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Disable SSL Verification")),(0,a.yg)("p",null,"To disable SSL verification, add the following to the ",(0,a.yg)("strong",{parentName:"p"},"SQLALCHEMY URI")," field:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"elasticsearch+https://{user}:{password}@{host}:9200/?verify_certs=False\n")))}d.isMDXComponent=!0}}]);