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 &gt; 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 &gt; 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,从数据库直接创建索引的更多相关文章

  1. Lucene学习之一:使用lucene为数据库表创建索引,并按关键字查询

    最近项目中要用到模糊查询,开始研究lucene,期间走了好多弯路,总算实现了一个简单的demo. 使用的lucene jar包是3.6版本. 一:建立数据库表,并加上测试数据.数据库表:UserInf ...

  2. Solr 4.3.0 配置Data import handler时出错

    启动solr的时候,居然出现了如下的错误: org.apache.solr.common.SolrException: RequestHandler init failure        at or ...

  3. linux下实现shell脚本自动连接mongodb数据库并创建索引

    在linux下创建shell脚本

  4. ORACLE 数据库需要创建索引的规则

    1.表的主键.外键必须有索引: 2.数据量超过300的表应该有索引: 3.经常与其他表进行连接的表,在连接字段上应该建立索引: 4.经常出现在Where子句中的字段,特别是大表的字段,应该建立索引: ...

  5. SQL语句-创建索引

    语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名)WITH FILLFACTOR = 填充因子值0~100 GO USE 库名GO IF EXISTS (SELECT * FRO ...

  6. lucene创建索引简单示例

    利用空闲时间写了一个使用lucene创建索引简单示例, 1.使用maven创建的项目 2.需要用到的jar如下: 废话不多说,直接贴代码如下: 1.创建索引的类(HelloLucene): packa ...

  7. mongo之 前后台创建索引 --noIndexBuildRetry

    在数据量超大的情形下,任何数据库系统在创建索引时都是一个耗时的大工程.MongoDB也不例外.因此,MongoDB索引的创建有两个选择,一个是前台方式,一个是后台方式.那这两种方式有什么差异呢,在创建 ...

  8. 分布式文档存储数据库之MongoDB索引管理

    前文我们聊到了MongoDB的简介.安装和对collection的CRUD操作,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13941797.html:今天我 ...

  9. 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

随机推荐

  1. Angular报错

    报错: Module 'App' is not available! You either misspelled the module name or forgot to load it. If re ...

  2. [Javascript] Using map() function instead of for loop

    As an example, if Jason was riding the roller coaster (and when isn’t he), your goal would be to cha ...

  3. 执行Socket socket = new Socket(ip, port);时抛出个异常:android.os.NetworkOnMainThreadException解决办法

    首先,确认你的android版本是4.0之后再用此方法解决,因为在4.0之后在主线程里面执行Http请求才会报这个错,也许是怕Http请求时间太长造成程序假死的情况吧.Android在4.0之前的版本 ...

  4. JAVA 爬虫Gecco

    主要代码: Gecco(matchUrl="https://github.com/{user}/{project}", pipelines="consolePipelin ...

  5. 有间距的表格布局 table布局

    1.先看有间距的布局效果: 2.少说多做,直接看代码(代码中有注释) <!DOCTYPE html> <html lang="zh"> <head&g ...

  6. oracel become INDEX UNUSABLE

    1. IMPORT PARTITION or conventional path SQL*Loader. 2. Direct-path SQL*Loader leaves affected local ...

  7. 转义字符 HTML 字符实体 < >: &等

    在 HTML 中,某些字符是预留的. 在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签. 如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用 ...

  8. tomcat 如何查看tomcat版本及位数

      tomcat 如何查看tomcat版本及位数 CreationTime--2018年8月31日10点16分 Author:Marydon 1.tomcat展示 2.具体操作 实现方式:在cmd命令 ...

  9. chardet 模块

    #coding:utf-8 #指定本文件编码为utf-8 #python 27 #xiaodeng #chardet模块 #chardet模块下载地址: #1)http://pan.baidu.com ...

  10. Centos5, 6, 以及Ubuntu18.04下更改系统时间和时区

    http://www.namhuy.net/2435/how-to-change-date-time-timezone-on-centos-6.html 查看日期(使用 -R 参数会以数字显示时区) ...