"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[1620],{95788:(e,r,t)=>{t.d(r,{Iu:()=>p,yg:()=>y});var n=t(11504);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?a(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function l(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var c=n.createContext({}),i=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):s(s({},r),e)),t},p=function(e){var r=i(e.components);return n.createElement(c.Provider,{value:r},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},f=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=i(t),f=o,y=u["".concat(c,".").concat(f)]||u[f]||d[f]||a;return t?n.createElement(y,s(s({ref:r},p),{},{components:t})):n.createElement(y,s({ref:r},p))}));function y(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var a=t.length,s=new Array(a);s[0]=f;var l={};for(var c in r)hasOwnProperty.call(r,c)&&(l[c]=r[c]);l.originalType=e,l[u]="string"==typeof e?e:o,s[1]=l;for(var i=2;i<a;i++)s[i]=t[i];return n.createElement.apply(null,s)}return n.createElement.apply(null,t)}f.displayName="MDXCreateElement"},28088:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>i});var n=t(86404),o=(t(11504),t(95788));const a={title:"Apache Solr",hide_title:!0,sidebar_position:13,version:1},s=void 0,l={unversionedId:"databases/solr",id:"databases/solr",title:"Apache Solr",description:"Apache Solr",source:"@site/docs/databases/solr.mdx",sourceDirName:"databases",slug:"/databases/solr",permalink:"/docs/databases/solr",draft:!1,editUrl:"https://github.com/apache/superset/edit/master/docs/docs/databases/solr.mdx",tags:[],version:"current",sidebarPosition:13,frontMatter:{title:"Apache Solr",hide_title:!0,sidebar_position:13,version:1},sidebar:"tutorialSidebar",previous:{title:"Apache Pinot",permalink:"/docs/databases/pinot"},next:{title:"Apache Spark SQL",permalink:"/docs/databases/spark-sql"}},c={},i=[{value:"Apache Solr",id:"apache-solr",level:2}],p={toc:i},u="wrapper";function d(e){let{components:r,...t}=e;return(0,o.yg)(u,(0,n.c)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,o.yg)("h2",{id:"apache-solr"},"Apache Solr"),(0,o.yg)("p",null,"The ",(0,o.yg)("a",{parentName:"p",href:"https://pypi.org/project/sqlalchemy-solr/"},"sqlalchemy-solr")," library provides a\nPython / SQLAlchemy interface to Apache Solr."),(0,o.yg)("p",null,"The connection string for Solr looks like this:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"solr://{username}:{password}@{host}:{port}/{server_path}/{collection}[/?use_ssl=true|false]\n")))}d.isMDXComponent=!0}}]);