Solr 07 - Solr从MySQL数据库中导入数据 (Solr DIH的使用示例)
1 加入数据导入处理器的jar包
复制Solr解压后dist目录中的:solr-dataimporthandler-4.10.4.jar;
粘贴到contrib/dataimporthandler/lib目录下, lib目录需要手动创建:

2 加入数据库驱动包
复制所用数据库服务器的相应jar包;
粘贴到contrib/db/lib目录下, db/lib目录需要手动创建:

注意: 这里使用的MySQL服务器版本为5.7.20, 故导入5.1.44版本的jar包 —— 其他较低版本的jar包可能会出现一些不可预知的Bug.
3 配置solrconfig.xml文件
在SolrCore(即collection1)中找到solrconfig.xml文件.
3.1 配置lib标签 - 加入驱动jar包
<!-- 配置加入数据导入、数据库驱动的jar包 -->
<lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*\.jar"/>
<lib dir="${solr.install.dir:../..}/contrib/db/lib" regex=".*\.jar"/>
3.2 配置requestHandler标签 - 加入DIH
Solr的数据索引分两种: 全量导入(full-import)和增量导入(delta-import):
① 全量导入: 就是一次性全部导入所有数据;
② 增量导入: 就是当数据库中的数据有更新时再作导入处理.
使用dataimport就需要在solrconfig.xml中添加DIH配置信息:
<!-- 加入数据导入的请求处理器 -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
3.3 在conf目录下创建data-config.xml
(1) data-config.xml文件:
注意: 这里field的column属性对应于数据库中表的字段, 而name属性的值必须与scheme.xml约束文件中新配置的field的name属性的值一致, 否则无法解析.
这里配置的MySQL表信息, 与Solr 06 - Solr中配置使用IK分词器 (配置schema.xml) 中使用的MySQL数据一致, 具体的SQL文件可以在 我的GitHub 中下载, 文件是Solr使用IK分词器的表数据.sql.
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<!-- 数据源配置 -->
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/solr?useSSL=true"
user="ur_login_name"
password="ur_pwd"/>
<document>
<!-- 配置sql语句执行结果, 与商品业务域的对应关系 -->
<entity name="product" pk="pid"
query="SELECT pid, name, catalog, catalog_name, price, description, picture
FROM products">
<field column="pid" name="id"/>
<field column="name" name="product_name"/>
<field column="catalog" name="product_catalog"/>
<field column="catalog_name" name="product_catalog_name"/>
<field column="price" name="product_price"/>
<field column="description" name="product_description"/>
<field column="picture" name="product_picture"/>
</entity>
</document>
</dataConfig>
(2) 参数说明:
①
dataSource: 定义了数据的位置, 对于数据库, 则是DSN(Data Source Name, 即数据源名称, 数据库服务器的主机名、端口和数据库名、用户、密码); 对于HTTP数据源, 则是基本的URL.
②entity: 实体会被处理生成包含多个字段的文档的集合, 会被发送给Solr进行索引. 对于RDBMS数据源, 一个实体是一个视图或表, 可能被一至多个SQL语句处理来生成一系列具有一或多个列(字段)的行(文档).
③processor: 一个实体处理器会完成整个从数据源抽取内容、转换并将其添加到索引的工作, 可用自定义实体处理器扩展或替换默认提供的处理器.
④transformer: 从实体中取得的每个字段的集都可以选择进行转换, 此过程可修改字段、创建新字段或从单个行生成多个行. 可通过公用接口自定义转换器.
(3) 其他配置用法说明:
<entity name="product" pk="pid"
query="SELECT * FROM products"
deltaImportQuery="SELECT * FROM products where pid='${dih.delta.id}'"
deltaQuery="SELECT pid FROM products where last_modified > '${dih.last_index_time}'" >
<field />
<!-- ...... -->
</entity>
①
pk代表主键;
②query: 是在全量导入(full-import)模式下使用的查询;
③deltaImportQuery和deltaQuery: 用于增量导入(delta-import)模式:a) 数据库中要有一个类型为
timestamp的类似于last_modified的时间字段;
b) 执行数据导入时, Solr会在自动生成conf/dataimport.properties文件, 用来记录最后一次导入的时间;
c) 执行delta-import的时候, 先根据deltaQuery查出需要导入的数据的id, 然后通过id来执行deltaImportQuery, 最终实现增量导入数据.
(4) Solr 5.x版本的变化:
① Solr 5.x 之后的版本使用
${dih.delta.id}来获取需要增量导入的数据的主键, 之前的版本使用的是${dataimporter.delta.ID};
② 使用${dih.last_index_time}来获取dataimport.properties文件中last_index_time的属性值, 之前的版本使用的是${dataimporter.last_index_time}.
4 重启Tomcat并查看DIH的配置
重启Tomcat, 在菜单栏的[Dataimport]查看配置的Entity是否生效. 也可通过菜单栏的[Files]查看配置文件.

5 执行数据导入
(1) 通过Solr管理界面的Dataimport方式导入:

注意: 由于Solr管理界面的不稳定性, 索引状态的显示可能会消失, 可通过查看Dashboard中JVM-Memory的波动程度, 确定是否处于索引状态.
(2) 也可通过HTTP请求的方式导入, HTTP请求URL格式为:
http://ip:port/[web-dir]/CoreName/dataimport?command=command[¶ms], 其中command命令见下述示例, params参数有如下选项:
| 参数 | 描述 |
|---|---|
| clean | 默认为true, 表示是否在建立下一次索引前清除原有索引(慎用) |
| commit | 默认为true, 表示是否在操作完成后提交 |
| debug | 默认为false, 表示是否以Debug模式运行. 此默认的commit默认为false. |
| entity | 用已指定操作的entity, 只能指定DIH配置文件中内首层元素的name, 若传递空值, 则对所有entity执行操作. |
| optimize | 默认为true, 表示在操作之后是否optimize(优化索引). |
(3) 示例:
① 如果执行全量导入, 导入前清除索引, 导入后提交结果, 则发送如下URL请求:
http://ip:port/[webdir/]CoreName/dataimport?command=full-import&clean=true&commit=true② 如果执行增量导入, 导入前不清除索引, 导入后提交结果, 则发送如下URL请求:
http://ip:port/[webdir/]CoreName/dataimport?command=delta-import&clean=false&commit=true
版权声明
作者: 马瘦风
出处: 博客园 马瘦风的博客
您的支持是对博主的极大鼓励, 感谢您的阅读.
本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.
Solr 07 - Solr从MySQL数据库中导入数据 (Solr DIH的使用示例)的更多相关文章
- Solr 创建core 从MySql数据库中导入数据
一.创建数据表和数据 在MySql数据中创建mysolrInfo表, 创建字段 id 主键,自动增加 pname :姓名 age :年龄 addtime :增加时间 增加几条数据 二.创建core 当 ...
- solr6.6教程-从mysql数据库中导入数据(三)
整理多半天的solr6.6,终于算是把solr6.6中配置数据库弄出来了,网上的文章千篇一律,各说个的,没有一篇统一覆盖solr6.6版本配置的 帖子,本章节我会把配置的一些注意事项一一列举,由于时间 ...
- [MySQL]load data local infile向MySQL数据库中导入数据时,无法导入和字段不分离问题。
利用load data将文件中的数据导入数据库表中的时候,遇到了两个问题. 首先是load data命令无法执行的问题: 命令行下输入load data local infile "path ...
- 使用sqoop将MySQL数据库中的数据导入Hbase
使用sqoop将MySQL数据库中的数据导入Hbase 前提:安装好 sqoop.hbase. 下载jbdc驱动:mysql-connector-java-5.1.10.jar 将 mysql-con ...
- 从Mysql数据库中导入导出表结构
1.从Mysql数据库中导入sql表 很简单,只需要一个命令即可搞定:[root@localhost ~]# mysql -uroot -piweb_xxx_mysql iweb < modif ...
- python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图
python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...
- mysql数据库中插入数据INSERT INTO SET的优势
往mysql数据库中插入数据.以前常用 INSERT INTO 表名 (列名1,列名2…) VALUES(列值1,列值2); 如果在PHP程序中,就会写成如下示例(往商品库里增加商品) $sql = ...
- ArcCatalog中通过ArcSDE向Oracle数据库中导入数据
将数据导入到Oracle指定的表空间的具体内容如下: 首先,在ArcCatalog中建立指定表空间的数据库连接(要以指定表空间的用户登录): 然后,在ArcCatlog中定位到数据源,选中并拷贝图层; ...
- JDBC Java 程序从 MySQL 数据库中读取数据,并备份到 xml 文档中
MySQL 版本:Server version: 5.7.17-log MySQL Community Server (GPL) 相关内容:JDBC Java 程序从 MySQL 数据库中读取数据,并 ...
随机推荐
- Python封装:实现输出一个文件夹下所有各个文件的地址存为列表集合内——Jason niu
def getAllImages(folder): assert os.path.exists(folder) assert os.path.isdir(folder) imageList = os. ...
- 使用Cordova打包Vue项目
因为公司项目要求, 原本的vue移动端项目, 现在要求能使用定位, 调用摄像头等功能, 并且开发成混合APP. 一个小白的孤军奋战史, 记录一下, 以备后用.... 第一步: 安装cordova 在命 ...
- 多个PVSS数据点属性读写的优化处理
注:本译文出自15多年前,尚未用最新软硬件平台进行重新测试,只提供方法论层面的参考,具体性能指标不具备参考意义. 多个PVSS数据点属性读写的优化处理 本文档概述了测试三种读取和写入多个PVSS数据点 ...
- 基于.net的Socket异步编程总结
最近在为公司的分布式服务框架做支持异步调用的开发,这种新特性的上线需要进行各种严格的测试.在并发性能测试时,性能一直非常差,而且非常的不稳定.经过不断的分析调优,发现Socket通信和多线程异步回调存 ...
- 软件工程第三周的学习报告 html<input> final finally finalize 的比较 BigInteger
三月十三号下午: html的<input>的三个属性pattern(限定用户的输入格式)与placeholder(显示的)与required(不能为空) 代码案例: pattern与pla ...
- JetBrains系列IDE快捷键大全(转载)
编辑 快捷键组合 说明 Ctrl + Space 代码自动完成提示(选择) Alt + Enter 显示意图动作和快速修复 Ctrl + P 参数信息 (在调用方法参数忘记的时候,提示) Ctrl + ...
- Jvm 内存模型 —— GC
一.Jvm 原理 二.Jvm 运行时数据区( Run-Time Data Areas ) (主要是关于 non-stack 区域的详细划分) 从上图可以清楚地看到:程序计数器.Jvm 栈.本地方法栈 ...
- Java spring boot 2.0连接mysql异常:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone
解决办法:application.yml提示信息表明数据库驱动com.mysql.jdbc.Driver'已经被弃用了.应当使用新的驱动com.mysql.cj.jdbc.Driver' com.my ...
- 【ASP】response和sever对象实现用户登录
1.问题提出 设计两个登录界面:一个register.asp页面用于输入账号,密码等信息进行登录.另一个页面welcome.asp用于显示登录成功的信息.利用request的两个对象response和 ...
- Python基础之面向对象3(继承)
一.继承相关概念 1.语法: 2.定义: 3.优缺点: 4.相关概念: 5.相关内置函数: 6.继承内存图: 7.多继承: 二.多态相关概念 1.定义及作用: 2.重写概念: 3.运算符重载: 定义: ...