zoukankan      html  css  js  c++  java
  • 10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)

    转载请出自出处:http://www.cnblogs.com/hd3013779515/

    1.创建MySQL数据

    create database solr;
    
    use solr;
    
    DROP TABLE IF EXISTS student;
    
    CREATE TABLE student (
    
    id char(10) NOT NULL,
    
    stu_name varchar(50) DEFAULT NULL,
    
    stu_sex int(1) DEFAULT NULL,
    
    stu_address varchar(200) DEFAULT NULL,
    
    updateTime timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    isDeleted int(1) DEFAULT 0,
    
    PRIMARY KEY (id)
    
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO student VALUES ('1000000001', '李莉', 0, '上海市中山路',default,default);
    
    INSERT INTO student VALUES ('1000000002', 'Tom', 1, 'NewYork',default,default);
    
    INSERT INTO student VALUES ('1000000003', '张小贝', 0, '江西省泰和县中山路',default,default);
    
    INSERT INTO student VALUES ('1000000004', '鲍勃', 1, '北京市海淀区知春路',default,default);
    
    INSERT INTO student VALUES ('1000000005', 'Tim', 0, 'Paris',default,default);
    
    select * from student;

    2. DIH全量从MYSQL数据库导入数据

    1配置/home/solrhome/collection1/conf/solrconfig.xml

    vim /home/solrhome/collection1/conf/solrconfig.xml

    在<requestHandler name="/select" class="solr.SearchHandler">前面上加上一个dataimport的处理的Handler

    <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    
    <lst name="defaults">
    
    <str name="config">data-config.xml</str>
    
    </lst>
    
    </requestHandler>

    2在同目录下添加data-config.xml

    vim /home/solrhome/collection1/conf/data-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <dataConfig>
    
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.137.168:3306/solr" user="root" password="root" batchSize="-1" />
    
    <document name="testDoc">
    
    <entity name="student" pk="id"
    
    query="select * from student">
    
    <field column="id" name="id"/>
    
    <field column="stu_name" name="stu_name"/>
    
    <field column="stu_sex" name="stu_sex"/>
    
    <field column="stu_address" name="stu_address"/>
    
    </entity>
    
    </document>
    
    </dataConfig>

    说明:

    dataSource是数据库数据源。

    Entity就是一张表对应的实体,pk是主键,query是查询语句。

    Field对应一个字段,column是数据库里的column名,后面的name属性对应着Solr的Filed的名字。

    3修改同目录下的schema.xml,这是Solr对数据库里的数据进行索引的模式

    vim /home/solrhome/collection1/conf/schema.xml

    <field name="stu_name" type="text_ik" indexed="true" stored="true" multiValued="false" /> 
    
    <field name="stu_sex" type="int" indexed="true" stored="true" multiValued="false" /> 
    
    <field name="stu_address" type="text_ik" indexed="true" stored="true" multiValued="false" />

    4)拷贝关联jar

    拷贝mysql-connector-java-3.1.13-bin.jar和solr-dataimporthandler-4.10.3.jar

    cp /usr/local/solr-4.10.3/dist/solr-dataimporthandler-4.10.3.jar /home/tomcat6/webapps/solr/WEB-INF/lib/

    cp /home/test/mysql-connector-java-3.1.13-bin.jar /home/tomcat6/webapps/solr/WEB-INF/lib/

    5)重启Solr

    如果配置正确就可以启动成功。

    solrconfig.xml是solr的基础文件,里面配置了各种web请求处理器、请求响应处理器、日志、缓存等。

    schema.xml配置映射了各种数据类型的索引方案。分词器的配置、索引文档中包含的字段也在此配置。

    6)索引测试

    (1)Solr控制台导入

    001

    002

    (2)HTTP方式导入

    http://192.168.137.168:8080/solr/collection1/dataimport?command=full-import&commit=true&clean=false

    003

    7)分批次导入数据

    如果数据库数据太大,可以分批次导入数据。

    vim /home/solrhome/collection1/conf/data-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <dataConfig>
    
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.137.168:3306/solr" user="root" password="root" batchSize="-1" />
    
    <document name="testDoc">
    
    <entity name="student" pk="id"
    
    query="select * from student limit ${dataimporter.request.length} offset ${dataimporter.request.offset}">
    
    <field column="id" name="id"/>
    
    <field column="stu_name" name="stu_name"/>
    
    <field column="stu_sex" name="stu_sex"/>
    
    <field column="stu_address" name="stu_address"/>
    
    </entity>
    
    </document>
    
    </dataConfig>

    上面主要是通过内置变量 “${dataimporter.request.length}”和 “${dataimporter.request.offset}”来设置一个批次索引的数据表记录数,请求的URL示例如下:

    http://192.168.137.168:8080/solr/collection1/dataimport?command=full-import&commit=true&clean=false&offset=0&length=2

    004

    导入效果如下

    clip_image010

    3.DIH增量从MYSQL数据库导入数据
    已经学会了如何全量导入MySQL的数据,全量导入在数据量大的时候代价非常大,一般来说都会适用增量的方式来导入数据,下面介绍如何增量导入MYSQL数据库中的数据,以及如何设置定时来做。

    特别注意:DIH增量也是可以做全量数据导入,所以生产环境只要设置DIH增量方式。

    1)数据库表的更改

    新增一个字段updateTime,类型为timestamp,默认值为CURRENT_TIMESTAMP。有了这样一个字段,Solr才能判断增量导入的时候,哪些数据是新的。因为Solr本身有一个默认值last_index_time,记录最后一次做full import或者是delta import(增量导入)的时间,这个值存储在文件conf目录的dataimport.properties文件中。

    more dataimport.properties

    clip_image012

    2data-config.xml中必要属性的设置

    vim /home/solrhome/collection1/conf/data-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <dataConfig>
    
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.137.168:3306/solr" user="root" password="root" batchSize="-1" />
    
    <document name="testDoc">
    
    <entity name="student" pk="id"
    
    query="select * from student where isDeleted=0"
    
    deltaImportQuery="select * from student where id='${dih.delta.id}'"
    
    deltaQuery="select id from student where updateTime> '${dataimporter.last_index_time}' and isDeleted=0"
    
    deletedPkQuery="select id from student where isDeleted=1">
    
    <field column="id" name="id"/>
    
    <field column="stu_name" name="stu_name"/>
    
    <field column="stu_sex" name="stu_sex"/>
    
    <field column="stu_address" name="stu_address"/>
    
    </entity>
    
    </document>
    
    </dataConfig>

    transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签

    query:查询数据库表符合记录数据

    deltaQuery:增量索引查询主键ID  注意这个只能返回ID字段

    deltaImportQuery:增量索引查询导入的数据

    deletedPkQuery:增量索引删除主键ID查询 注意这个只能返回ID字段

    增量索引的原理是从数据库中根据deltaQuery指定的SQL语句查询出所有需要增量导入的数据的ID号。

    然后根据deltaImportQuery指定的SQL语句返回所有这些ID的数据,即为这次增量导入所要处理的数据。

    核心思想是:通过内置变量“${dih.delta.id}”和 “${dataimporter.last_index_time}”来记录本次要索引的id和最近一次索引的时间。

    如果业务中还有删除操作,可以在数据库中加一个isDeleted字段来表明该条数据是否已经被删除,这时候Solr在更新index的时候,可以根据这个字段来更新哪些已经删除了的记录的索引。

    3)测试增量导入

    DIH全量导入

    http://192.168.137.168:8080/solr/collection1/dataimport?command=full-import&commit=true&clean=true

    005

    clip_image016

    修改student数据

    update student set stu_name="jerry" where id = '1000000005';
    
    update student set isDeleted=1 where id = '1000000004';
    
    INSERT INTO student VALUES ('1000000006', 'Tim11', 0, 'Paris',default,default);

    DIH增量导入数据

    http://192.168.137.168:8080/solr/collection1/dataimport?command=delta-import

    006

    clip_image020

    4)设置增量导入为定时执行的任务

    可以用Windows计划任务,或者Linux的Cron来定期访问增量导入的连接来完成定时增量导入的功能,这其实也是可以的,而且应该没什么问题。

    但是更方便,更加与Solr本身集成度高的是利用其自身的定时增量导入功能。

    1.增加关联jar

    cp /home/test/apache-solr-dataimportscheduler.jar /home/tomcat6/webapps/solr/WEB-INF/lib/

    2、修改solr的WEB-INF目录下面的web.xml文件:

    vim /home/tomcat6/webapps/solr/WEB-INF/web.xml
    为<web-app>元素添加一个子元素

    <listener>
    
    <listener-class>
    
    org.apache.solr.handler.dataimport.scheduler.ApplicationListener
    
    </listener-class>
    
    </listener>

    3、新建配置文件dataimport.properties:

    在SOLR_HOMEsolr目录下面新建一个目录conf(注意不是SOLR_HOMEsolrcollection1下面的conf)

    mkdir /home/solrhome/conf

    vim /home/solrhome/conf/dataimport.properties

    下面是最终我的自动定时更新配置文件内容:

    #################################################
    
    # #
    
    # dataimport scheduler properties #
    
    # #
    
    #################################################
    
    # to sync or not to sync
    
    # 1 - active; anything else - inactive
    
    syncEnabled=1
    
    # which cores to schedule
    
    # in a multi-core environment you can decide which cores you want syncronized
    
    # leave empty or comment it out if using single-core deployment
    
    # syncCores=game,resource
    
    syncCores=collection1
    
    # solr server name or IP address
    
    # [defaults to localhost if empty]
    
    server=192.168.137.168
    
    # solr server port
    
    # [defaults to 80 if empty]
    
    port=8080
    
    # application name/context
    
    # [defaults to current ServletContextListener's context (app) name]
    
    webapp=solr
    
    # URLparams [mandatory]
    
    # remainder of URL
    
    #http://localhost:8983/solr/collection1/dataimport?command=delta-import&clean=false&commit=true
    
    params=/dataimport?command=delta-import&clean=false&commit=true
    
    # schedule interval
    
    # number of minutes between two runs
    
    # [defaults to 30 if empty]
    
    interval=1
    
    # 重做索引的时间间隔,单位分钟,默认7200,即1天; 
    
    # 为空,为0,或者注释掉:表示永不重做索引
    
    reBuildIndexInterval=2
    
    # 重做索引的参数
    
    reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
    
    # 重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
    
    # 两种格式:2012-04-11 03:10:00 或者 03:10:00,后一种会自动补全日期部分为服务启动时的日期
    
    reBuildIndexBeginTime=03:10:00

    4、测试

    重启tomcat

    一般来说要在你的项目中引入Solr需要考虑以下几点:
    1、数据更新频率:每天数据增量有多大,及时更新还是定时更新
    2、数据总量:数据要保存多长时间
    3、一致性要求:期望多长时间内看到更新的数据,最长允许多长时间延迟
    4、数据特点:数据源包括哪些,平均单条记录大小
    5、业务特点:有哪些排序要求,检索条件
    6、资源复用:已有的硬件配置是怎样的,是否有升级计划

    参考http://www.cnblogs.com/luxiaoxun/p/4442770.html

  • 相关阅读:
    九.Spring Boot JPAHibernateSpring Data
    JIRA安装过程中链接mysql的问题!
    五、案例-指令参考-freemarker指令、表达式
    四、模版指令操作
    三、freemarker数据、模版指令
    二、freemarker.controller半自动静态化+Tomcat虚拟资源映射
    一、springMVC、freemarker页面半自动静态化
    window窗口-button(按钮)-dialog(对话框,带按钮)
    panel面板
    python 给定年份、月份,返回当月对应天数
  • 原文地址:https://www.cnblogs.com/hd3013779515/p/6883603.html
Copyright © 2011-2022 走看看