Solr4:配置Data Import,从数据库直接创建索引
2013-08-02 14:27
561 查看
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。
相关文章推荐
- c# sqlite 数据库加密2010-05-29 10:55用了ADO.NET 2.0 SQLite Data Provider 这样可以直接利用它来创建一个加密的sqlite数据库。
- solr-DIH:dataimport增量全量创建索引
- c# sqlite 数据库加密2010-05-29 10:55用了ADO.NET 2.0 SQLite Data Provider 这样可以直接利用它来创建一个加密的sqlite数据库。
- Spring Data JPA 配置数据库表根据实体属性自动创建表结构
- 索引---最直接的切入点(MSSQL个人笔记之数据库优化之路 一)
- 数据库优化之创建索引
- MYSQL创建数据库时候直接指定编码和排序规则
- Solr4:创建索引时的一些建议
- 《MySQL入门很简单》学习笔记(7)之第7章索引(关键词:数据库/MySQL/索引/设计索引/创建索引/删除索引)
- PostgresXC:从源码编译、安装、配置数据库集群以及用pg_basebackup配置Datanode的热备份
- SQL Mobile 2005 Replication配置全过程完全图解(三、设置数据库权限、创建发布快照)
- MySQL外键及级联删除 && 表的存储引擎与创建索引 && 删除数据库和表
- Lucene 4.10 + Mysql 5.5 创建数据库表索引(Lucene 学习序列1)
- Oracle sql 调优:使用虚拟索引在生产环境测试创建索引对数据库性能的影响
- MongoDB非关系型数据库的简介、创建数据库和表、配置用户等
- 通过hibernate配置文件创建数据库表
- solr DataImportHandler怎么用 从数据库建索引
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
- mysql读写分离的完整配置【centos6.5-mini版操作系统中mysql数据库的操作日志以及创建的数据库和表均在/var/lib/mysql此目录下,yum源在/var/lib/yum下】
- solr dataimport 的配置