Solr4:配置Data Import,从数据库直接创建索引
1. 要求
将数据库中的数据直接创建到Solr索引中去。先做全部索引,然后定期做增量索引。
2. 环境
Solr4.4版本,Tomcat7.0版本,Oracle 11g,已经配置好Tomcat与Solr的集成,包括中文分词等。
3. 实现步骤
3.1 编辑solrconfig.xml文件,在合适位置增加如下代码:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
3.2 在conf目录下创建data-config.xml文件,内容如下:
<dataConfig>
<dataSource driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" user="mybbs" password="bbs001"/>
<document>
<entity name="bbsdetail" query="select DETAIL_ID,TITLE,CATEGORY_NAME,PUBLISH_TIME from VIEW_DETAIL">
</entity>
</document>
</dataConfig>
注意:上面查询语句中定义的字段必须在schema.xml文件中有相关定义。在我这里,VIEW_DETAIL是一张视图,包含了三张表中所有需要索引的列。
上面是Oracle数据库相关代码,如果是SQL Server2012版本,代码如下:
<dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1434;databaseName=rujia;user=sa;password=yourpass;"/>
3.3 拷贝数据库JDBC驱动包及Solr相关的包到$solr-home/lib目录,在我这里是C:/Solr/lib。
文件包括:ojdbc6.jar(如果是SQL Server2012,则是:sqljdbc4.jar)、solr-dataimporthandler-4.4.0.jar、solr-dataimporthandler-extras-4.4.0.jar,后两个包在solr-4.4.0.zip包的dist目录下。
3.4 重新启动Tomcat,登录Solr管理后台,即可以在collection1下面的Dataimport中实现操作。

说明:
- 在做delta-import(增量索引)的时候,应该把clean核选框中勾去掉,以避免清除之前创建的索引。
- 可以选中Auto-Refresh Status核选框,以实时监控当前数据导入状态。
- 可以选中Debug核选框,以方便在出现问题时,通过查看Tomcat后台及Solr控制台界面找出错误原因。
4. 若干问题
问题1:数据库中字段名与schema.xml文件中的字段名不一致时,作如下修改:
<dataConfig>
<dataSource driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" user="mybbs" password="bbs001"/>
<document>
<entity name="bbsdetail"
query="select DETAIL_ID,TITLE,CATEGORY_NAME,PUBLISH_TIME from VIEW_DETAIL"> <field column="TITLE" name="solr_title"/>
<field column="CATEGORY_NAME" name="solr_category_name"/>
</entity>
</document>
</dataConfig>
问题2:数据库有Clob字段需要抓取时,作如下修改:
<dataConfig>
<dataSource driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" user="mybbs" password="bbs001"/>
<document>
<entity name="bbsdetail" transformer="ClobTransformer"
query="select DETAIL_ID,TITLE,CATEGORY_NAME,DETAIL_INFO,PUBLISH_TIME from VIEW_DETAIL">
<field column="DETAIL_INFO"clob="true"/>
</entity>
</document>
</dataConfig>
说明:在entity上面增加transformer="ClobTransformer",然后在Clob列上增加“clob="true"即可。
问题3:需要做增量索引时,作如下修改:
<dataConfig>
<dataSource driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" user="mybbs" password="bbs001"/>
<document>
<entity name="bbsdetail" pk="DETAIL_ID" transformer="ClobTransformer" query="select * from VIEW_DETAIL"
deltaImportQuery="select * from VIEW_DETAIL where DETAIL_ID='${dih.delta.DETAIL_ID}'"
deltaQuery="select DETAIL_ID from VIEW_DETAIL where PUBLISH_TIME > to_date('${dih.last_index_time}','yyyy-mm-dd hh:mi:ss')"> <field column="DETAIL_INFO"clob="true"/>
</entity>
</document>
</dataConfig>
说明:
- pk参数表示主键字段名。
- deltaQuery参数为查询出所有更新时间大于最后创建索引时间的主键值。${dih.last_index_time}是一个内置变量,此值默认存储于conf/dataimport.properties文件中。
- deltaImportQuery参数是按照主键值查询数据的语句。
- pk值,deltaQuery查询字段值,deltaImportQuery查询参数这三个名称必须保持一致(如本例中都为DETAIL_ID)。
问题4:需要查询从表时,作如下修改:
<dataConfig>
<dataSource driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" user="mybbs" password="bbs001"/>
<document>
<entity name="bbsdetail" pk="DETAIL_ID" transformer="ClobTransformer" query="select * from VIEW_DETAIL where district_id=3004"
deltaImportQuery="select * from VIEW_DETAIL where DETAIL_ID='${dih.delta.DETAIL_ID}'"
deltaQuery="select DETAIL_ID from VIEW_DETAIL where PUBLISH_TIME > to_date('${dih.last_index_time}','yyyy-mm-dd hh:mi:ss')"> <field column="DETAIL_INFO" clob="true"/> <entity name="bbscomment" query="select COMMENT_BODY||'('||to_char(COMMENT_TIME,'yyyy-mm-dd hh:mi:ss')||')' as CONCAT_RESULT
from BBSCOMMENT where detail_id=${bbsdetail.DETAIL_ID}"> <field column="CONCAT_RESULT" name="COMMENT_INFO"/>
</entity>
</entity>
</document>
</dataConfig>
5. 补充说明
- BBSDETAIL是主表,BBSCOMMENT是从表,为1..n的关系。
- 上述子查询是将从表中的记录形成一条摘要(用操作符”||“将多列合并为一列),保存到索引中。
- schema.xml文件中必须将comment_info字段的multiValued属性设置为true。
Solr4:配置Data Import,从数据库直接创建索引的更多相关文章
- Lucene学习之一:使用lucene为数据库表创建索引,并按关键字查询
最近项目中要用到模糊查询,开始研究lucene,期间走了好多弯路,总算实现了一个简单的demo. 使用的lucene jar包是3.6版本. 一:建立数据库表,并加上测试数据.数据库表:UserInf ...
- Solr 4.3.0 配置Data import handler时出错
启动solr的时候,居然出现了如下的错误: org.apache.solr.common.SolrException: RequestHandler init failure at or ...
- linux下实现shell脚本自动连接mongodb数据库并创建索引
在linux下创建shell脚本
- ORACLE 数据库需要创建索引的规则
1.表的主键.外键必须有索引: 2.数据量超过300的表应该有索引: 3.经常与其他表进行连接的表,在连接字段上应该建立索引: 4.经常出现在Where子句中的字段,特别是大表的字段,应该建立索引: ...
- SQL语句-创建索引
语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名)WITH FILLFACTOR = 填充因子值0~100 GO USE 库名GO IF EXISTS (SELECT * FRO ...
- lucene创建索引简单示例
利用空闲时间写了一个使用lucene创建索引简单示例, 1.使用maven创建的项目 2.需要用到的jar如下: 废话不多说,直接贴代码如下: 1.创建索引的类(HelloLucene): packa ...
- mongo之 前后台创建索引 --noIndexBuildRetry
在数据量超大的情形下,任何数据库系统在创建索引时都是一个耗时的大工程.MongoDB也不例外.因此,MongoDB索引的创建有两个选择,一个是前台方式,一个是后台方式.那这两种方式有什么差异呢,在创建 ...
- 分布式文档存储数据库之MongoDB索引管理
前文我们聊到了MongoDB的简介.安装和对collection的CRUD操作,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13941797.html:今天我 ...
- 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置
Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...
随机推荐
- 一次真实的蓝屏分析 ntkrnlmp.exe
故事背景: 话说我一直都是远程公司的电脑,在我晚上11点敲代码敲得正爽的时候,被远程的主机挂掉了,毫无征兆的挂掉了,我特么还好有闲着没事就ctrl + s保存代码的习惯,要不然白敲了那么久,我以为是公 ...
- maven 下载源码
mvn eclipse:eclipse -DdownloadSource=true
- Discuz常见小问题-如何修改favourite图标
1做好一个ico图标之后,直接替换目录下的对应文件即可, 如果没效果刷新浏览器或更新后台CSS缓存.
- Discuz常见大问题-如何自定义单个页面
比如我们先做一个最简单的网站的最后一页关于我们(插入了一幅图片,同时加入了几行文字) 先做好两个页面的文件(php页面是负责解析htm页面的,目前这两个页面都是空的) mypage_about.php ...
- NSURLSession 学习笔记
NSURLSession 学习笔记 一:NSURLSession 类似之前的NSURLConnection, 可配置每个session的 cookie,证书等网络连接配置信息 NSURLSession ...
- 算法笔记_168:历届试题 矩阵翻硬币(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义: ...
- 使用autoconfig
1. 增加maven 依赖 <properties> <maven.compiler.target>1.8</maven.compiler.target> < ...
- Mac 通过活动监视器关闭卡死进程
前言: 心好累,Lantern太不省事了 之前装过之后,就设定了开启自启动,搞得我上网都受影响(这玩意,qq没事,但是网易云之类的一些软件上网都不行了...就是这玩意搞的鬼) 没办法,点击关闭吧... ...
- java.lang.NoClassDefFoundError: Could not initialize class com.demo.jdbc.utils.MyJdbcUtils
jdbc编写工具类的过程中测试失败, 出现如下错误: 原因:初始化的过程中执行静态代码块的过程中出现错误, 也就是说, 加载配置文件错误: 没有加载到指定路径的配置文件. 我的MyJdbcUtil ...
- HDUOJ-----2838Cow Sorting(组合树状数组)
Cow Sorting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...