Sor基础(下) - 通过数据库数据索引

5.从MySQL数据库导入数据至solr

关系型数据库:以MySQL为例

  1. 请参照其他教程搭建MySQL数据库环境,并执行以下sql创建测试数据。
  • 创建solr database
create database solr;
  • 在solr database中创建user表
use solr;
create table user(id bigint primary key, user_name varchar(60), sex bit, birth date, salary int);
  • 往user表插入测试数据
insert into user (id, user_name, sex, birth, salary) values(1,'user1',1,'1992-04-12',5000);
  1. 导入依赖包
    请在core对应的lib目录中导入以下三个依赖包,包括mysql驱动包(可在mysql官网下载,注意其jdk版本)和dataimport依赖包。


    依赖包
  2. 配置data-config.xml

<dataConfig>
  <dataSource name="jdbcDataSource" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/solr?useUnicode=true&amp;characterEncoding=utf-8" user="root" password="mysql"/>
  <document>
     <entity dataSource="jdbcDataSource" name="user" query="select * from user">
        <field column="id" name="id"/>
        <field column="user_name" name="userName"/>
        <field column="sex" name="sex"/>
        <field column="birth" name="birth"/>
        <field column="salary" name="salary"/>
     </entity>
  </document>
</dataConfig>

DataSource元素属性

  • name:表示给你的数据源起个别名,便于entity元素引用;
  • type:solr内置的数据源类名;
  • driver:驱动类的完整包路径;
  • url:即jdbc连接的url,url中不可包含以下5中特殊字符,如果已存在则需将特殊字符按照entity列转义;


    特殊字符转义表
  • batchSize:表示JDBC从数据库一个批次提取多少条数据,以防止一个批次返回数量过大撑爆内存;
  • maxRows:表示最多返回多少条记录,加入sql返回100万条记录,如果maxRows为10000,则最后只会得到10000条记录;
  • convertType:接受布尔类型参数,表示是否需要制定数据库表字段的类型,如果convertType设置为type,则实体中域定义需要添加type参数,如下;
<field column="id" name="id" type="long"/>

Entity元素属性

  • name:表示给你的entity起个别名;
  • query:需要执行的SQL语句;
  1. 修改schema.xml
   <field name="id" type="int" indexed="true" stored="true" required="false" multiValued="false" /> 
   <field name="userName" type="string" indexed="true" stored="true" required="false" multiValued="false"/>
   <field name="sex" type="boolean" indexed="true" stored="true" required="false" multiValued="false"/>
   <field name="birth" type="tdate" indexed="true" stored="true" required="false" multiValued="false"/>
   <field name="salary" type="int" indexed="true" stored="true" required="false" multiValued="false"/>
  1. 配置完成之后,在Solr Web控制台dataimport下执行操作即可导入数据。
6.从MongoDB导入数据到Solr
  1. 关于MongoDB的开发环境这里不过多的进行阐述,可以自行参考其他教程到MongoDB官网下载安装配置。以下使用MongoDB-3.2.22-releases版本进行演示。
  2. 首先通过mongod命令启动MongoDB服务器,随后另起命令行窗口通过mongo命令连接到默认test库。
  3. 依次通过以下命令建立我们的测试数据。
  • 切换到admin管理员数据库
> use admin
switched to db admin
  • 创建管理员账号,账号:yida,密码:123
> db.createUser(
... {user:"yida",
... pwd:"123",
... roles:["readWrite","dbAdmin"]
... }
... );
Successfully added user: { "user" : "yida", "roles" : [ "readWrite", "dbAdmin" ]}
  • 创建测试数据库solr-test
 > use solr-test;
switched to db solr-test
  • 为solr-test数据库创建一个测试账号,并为其赋予权限
> db.createUser(
... {user:"test",
... pwd:"123",
... roles:[{role:"dbOwner",db:"solr-test"}]
... }
... );
Successfully added user: {
        "user" : "test",
        "roles" : [
                {
                        "role" : "dbOwner",
                        "db" : "solr-test"
                }
        ]
}
  • 创建name为book的 Collection
> db.createCollection("book",{size:1000,capped:true,max:2000});
{ "ok" : 1 }
  • 在book Collection中插入几条数据
> db.createCollection("book",{size:1000,capped:true,max:2000});
{ "ok" : 1 }
> db.book.insert({"bookName":"Think in Java","lang":"en"});
WriteResult({ "nInserted" : 1 })
> db.book.insert({"bookName":"Head first Java","lang":"en"});
WriteResult({ "nInserted" : 1 })
> db.book.insert({"bookName":"Solr in Action","lang":"en"});
WriteResult({ "nInserted" : 1 })
> db.book.find();
{ "_id" : ObjectId("5c68ff8ffd698bb0daa84300"), "bookName" : "Think in Java", "l
ang" : "en" }
{ "_id" : ObjectId("5c68ffa3fd698bb0daa84301"), "bookName" : "Head first Java",
"lang" : "en" }
{ "_id" : ObjectId("5c68ffaffd698bb0daa84302"), "bookName" : "Solr in Action", "
lang" : "en" }
  1. 依赖包以及dataimport扩展包,将以下两个依赖包下载并拷贝到本地core的lib目录下;
  • 获取MongoDB驱动包,可搜索“MongoDB Java Driver Maven”(注意和自己安装的Maven版本保持一致);
  • solr官方没有提供NoSqlDataSouce数据源类来读取MongoDB,可以搜索“solr mongo dataimport github”或者到github来获取相关扩展源码以及jar包。

注意:由于扩展dataimport依赖的版本较低需要使用mongo驱动中已过时的com.mongodb.DB.authenticate方法,这边我们采用的驱动版本为2.13.0。

  1. 接下来就是配置data-config.xml,其内容如下。
<dataConfig>
  <dataSource name="mongoDataSource" type="MongoDataSource" database="solr-test" host="localhost" port="27017" username="test" password="123"/>
  <document>
     <entity name="book" processor="MongoEntityProcessor" query="{'lang':'en'}" collection="book" dataSource="mongoDataSource" rootEntity="true" onError="skip" transformer="MongoMapperTransformer">
       <field column="bookName" name="bookName" mongoField="bookName"/>
       <field column="lang" name="lang"/>
     </entity>
  </document>
</dataConfig>

DataSource的参数属性说明

  • name:表示数据源的别名;
  • type:表示数据源的类名;
  • database:表示你要连接的数据库名称;
  • host:表示需要连接的主机地址,默认localhost;
  • port:表示MongoDB监听端口号,默认27017;
  • username:必需参数,表示连接的数据库账号;
  • password:必需参数,表示连接的数据库密码;
    entity的参数属性说明
  • processor:制定处理器,即MongoEntityProcessor;
  • query:MongoDB的查询语法;
  • collection:需要查询的Collection名称;
  • dataSource:数据源
  • transformer:解决MongoDb返回的结果集里的field名称跟原始collection里field不一致的情况;
  1. 更新schema.xml中的域定义。
   <field name="bookName" type="string" indexed="true" stored="true" required="false" multiValued="false" /> 
   <field name="lang" type="string" indexed="true" stored="true" required="false" multiValued="false"/>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容