Solr 全量导入与增量导入 MySQL 数据

Solr版本Docker 7.4.0

  1. 启动Solr后需要去MySQL官网下载连接mysql的驱动https://dev.mysql.com/downloads/connector/
  2. 复制dist目录下的solr-dataimporthandler-7.4.0.jar包到./server/solr-webapp/webapp/WEB-INF/lib
  3. 复制MySQL官网下的mysql-connector-java-5.1.46-bin.jar 包到./server/solr-webapp/webapp/WEB-INF/lib
  4. 拷贝 /opt/solr/example/example-DIH/solr 目录里的 solr 目录到./server/solr 重命名一下
  5. 命名后进入文件夹 创建 core.properties 文件,写入内容 name=xxxx ,xxxx 为重命名的那个名字
  6. 进入conf文件夹,复制managed-schemaschema.xml,清空里面的内容
  7. 打开solrconfig.xml,搜索codecFactory,在这行后面加入<schemaFactory class="ClassicIndexSchemaFactory"/>
  8. 配置全量导入和增量导入
  • 表结构
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `name` varchar(255) DEFAULT NULL COMMENT '用户名',
  `email` varchar(255) DEFAULT NULL COMMENT '用户邮箱',
  `phone` varchar(11) NOT NULL COMMENT '手机号',
  `password` text NOT NULL COMMENT '密码Hash',
  `user_group` json DEFAULT NULL COMMENT '用户所属分组',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `deleted` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '0启用 1已删除',
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_unique_phone` (`phone`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
  • solr-data-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
    <dataSource type="JdbcDataSource"
                driver="com.mysql.jdbc.Driver"
                url="jdbc:mysql://172.16.1.109:3306/test"
                user="root"
                password="123456" />
    <document>
        <entity name="user" pk="id" 
            query="select * from user" 
            deltaImportQuery="SELECT * FROM user where updated_at > '${dataimporter.last_index_time}' or created_at > '${dataimporter.last_index_time}'" 
            deltaQuery="SELECT * FROM user where updated_at > '${dataimporter.last_index_time}' or created_at > '${dataimporter.last_index_time}'">
            <field column="id" name="id" />
            <field column="name" name="name" />
            <field column="email" name="email" />
            <field column="phone" name="phone" />
            <field column="password" name="password" />
            <field column="user_group" name="user_group" />
            <field column="created_at" name="created_at" />
            <field column="updated_at" name="updated_at" />
            <field column="deleted" name="deleted" />
        </entity>
    </document>
</dataConfig>
  • schema.xml
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="user" version="1.6">
  <uniqueKey>id</uniqueKey>
  <field name="_version_" type="long" indexed="true" stored="true"/>
  <field name="text" type="string" indexed="true" stored="false" multiValued="true"/>

  <field name="id" type="int" indexed="true" stored="true" multiValued="false"/>
  <field name="name" type="string" indexed="true" stored="true" multiValued="false"/>
  <field name="email" type="string" indexed="true" stored="true" multiValued="false"/>
  <field name="phone" type="string" indexed="true" stored="true" multiValued="false"/>
  <field name="password" type="string" indexed="false" stored="true" multiValued="false"/>
  <field name="user_group" type="string" indexed="true" stored="true" multiValued="false"/>
  <field name="created_at" type="string" indexed="true" stored="true" multiValued="false"/>
  <field name="updated_at" type="string" indexed="true" stored="true" multiValued="false"/>
  <field name="deleted" type="int" indexed="true" stored="true" multiValued="false"/>

  <fieldType name="string" class="solr.TextField" sortMissingLast="true" />
  <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
  <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
  <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
  <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
  <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
</schema>
  • tips:
    导入后发现,web面板中的时间戳时正确的,但是执行sql时,dataimporter.last_index_time获取到的时间时UTC时间。需要在/opt/solr/bin/solr.in.sh中插入SOLR_TIMEZONE="Asia/Shanghai",然后重启
  • 字段解释一下
    <field name="updated_at" type="string" indexed="true" stored="true" multiValued="false"/>
    name :这个就是用于在Solr中展示的字段,建议与MySQL中保持一致,避免误操作
    type:定义字段类型,除了ID数字类的,我基本上都是用string(日期类型的如果不进行比较判断,用string不会出现date类型转义的问题)
    indexed:需要用于检索的字段,都需要设置为true
    multiValued:这个属性用于设置是否是多个值,如果设置了true,出来的结果会是数组的合适,exp:[1,2,3,4]