solr搜索之mysql导入数据到solr(四)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

1      mysql导入数据到solr

方式一:创建项目,查询出数据,一条一条addsolr中;(不推荐)

方式二:通过配置复制数据到solr

以上已完成了在本地window8中对solr的部署,为solr添加了一个自定义的coredemo,并且引入了ik分词器。

那么该如何将本地的mysql的数据导入到solr中呢?

1.1    准备工作

1.1.1     准备数据源

mysql数据源:test库中的user表(7条数据),其中这个update_time字段是用于solr更新数据库数据的依据,表中必须得有这个字段。

 

SETFOREIGN_KEY_CHECKS=0;

 

------------------------------

-- Table structurefor user

------------------------------

DROP TABLE IFEXISTS `user`;

CREATE TABLE`user` (

  `id` int(10) NOT NULL AUTO_INCREMENT,

  `name` varchar(30) DEFAULT NULL,

  `sex` int(1) DEFAULT NULL,

  `title` varchar(200) DEFAULT NULL,

  `insert_time` datetime DEFAULT NULL,

  `update_time` datetime DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDBAUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

 

------------------------------

-- Records of user

------------------------------

INSERT INTO `user`VALUES ('1', '航三', '1', '有电脑','2017-05-02 15:40:19', '2017-05-03 15:40:22');

INSERT INTO `user`VALUES ('2', '理三', '1', '有电脑,生活就是游戏么。要努力啊', '2017-05-02 15:40:19', '2017-05-03 15:40:22');

INSERT INTO `user`VALUES ('3', '李四', '0', '准备工作完成之后就可以进行配置和操作了。', '2017-05-02 15:40:19', '2017-05-03 15:40:22');

INSERT INTO `user`VALUES ('4', '王五', '0', '这个demo主要是针对多图片上传时使用的,可以携带动态加载的参数。', '2017-05-02 15:40:19', '2017-05-0315:40:22');

INSERT INTO `user`VALUES ('5', '赵六', '1', 'demo里也有,多文件上传+预览功能。也可以自己去调U', '2017-05-25 15:43:03', '2017-05-25 15:43:07');

INSERT INTO `user`VALUES ('6', '周七', '0', '这个demo主要是针对多图片上传时使用的', '2017-05-02 15:43:23', '2017-05-11 15:43:26');

INSERT INTO `user`VALUES ('7', '李白', '1', '诗人','2017-05-02 15:43:23', '2017-05-02 15:43:25');

 

1.1.2     准备需要的jar

链接mysql驱动jarmysql-connector-java-5.1.14.jar(这个基本都有)

D:\solr-4.10.2\dist\solr-dataimporthandler-4.10.2.jar

wKiom1ljGVHxKX0bAABSUw1gJLg639.png

1.1.3     准备配置

solr的解压文件目录中找到“D:\solr-4.10.2\example\example-DIH\solr\db\conf”下的db-data-config.xml文件到你的core(比如:

D:\solr-4.10.2\example\demo-solr\demo\confconf目录下,并更名为data-config.xml

详细配置如下:

<dataConfig>

    <dataSourcetype="JdbcDataSource" driver="com.mysql.jdbc.Driver"

       url="jdbc:mysql://localhost:3306/test" user="root"password="123456"

        batchSize="100" />

    <document>

        <entity name="user"pk="id"

            query="SELECTid,name,sex,title,insert_time,update_time FROM user"

            deltaImportQuery="SELECTid,name,sex,title,insert_time,update_time FROM user whereid='${dataimporter.delta.id}'"

            deltaQuery="SELECT id FROMuser where update_time > '${dataimporter.last_index_time}'">

            <field column="id"name="id" />

            <field column="name"name="name" />

            <field column="sex"name="sex" />

                     <fieldcolumn="title" name="title" />

            <fieldcolumn="insert_time" name="insertTime" />

            <fieldcolumn="update_time" name="updateTime" />

        </entity>

    </document>

</dataConfig>

deltaImportQuery:获取增量数据时使用的SQL增量导入时使用

deltaQuery:获取pkSQL增量导入时使用

注意查询条件的写法:${..},如在本例中:

${dataimporter.last_index_time}索引上次导入时间

${ dataimporter.delta.id}实体user查询结果中的id,也可以用${user.id}表示

关于data-config.xml详解,参考博文:

http://www.jianshu.com/p/91a5a0c35475

http://blog.csdn.net/boolbo/article/details/50352331

1.2    配置实现

注意:如果是solr是使用tomcat进行启动,只是相关的jar和配置文件放的位置不一样。配置是一致的。

1、  拷贝mysql-connector-java-5.1.14.jarsolr-dataimporthandler-4.10.2.jarsolrD:\solr-4.10.2\example\solr-webapp\webapp\WEB-INF\lib目录中;

 

wKiom1ljGVuTsvJoAAB8wDsx8L0258.png

2,在D:\solr-4.10.2\example\demo-solr\demo\conf目录下,更改solrconfig.xml配置文件。添加如下内容:

<requestHandlername="/dataimport"class="org.apache.solr.handler.dataimport.DataImportHandler">

    <lst name="defaults">

         <strname="config">data-config.xml</str>

    </lst>

  </requestHandler>

3,在D:\solr-4.10.2\example\demo-solr\demo\conf目录下,更改schema.xml配置,配置相关字段:

<?xmlversion="1.0" encoding="UTF-8" ?>

<schemaname="example" version="1.5">

 

   <field name="_version_"type="long" indexed="true" stored="true"/>

   <field name="_root_"type="string" indexed="true" stored="false"/>

   <field name="id"type="string" indexed="true" stored="true"required="true" multiValued="false" />

   <!-- 指定分词类型-->

   <field name="name"type="text_ik" indexed="true" stored="true" />

   <field name="title"type="text_ik" indexed="true" stored="true"/>

   <field name="sex"type="int" indexed="false" stored="true" />

   <!-- field标签中的name值必须和data-config.xml中的fileld标签name值保持一致 -->

   <field name="insertTime"type="date" indexed="true" stored="true" />

   <field name="updateTime"type="date" indexed="true" stored="true"/>

 

       <uniqueKey>id</uniqueKey>

       <fieldType name="int"class="solr.TrieIntField" precisionStep="0"positionIncrementGap="0"/>

    <fieldType name="string"class="solr.StrField" sortMissingLast="true" />

    <fieldType name="long"class="solr.TrieLongField" precisionStep="0"positionIncrementGap="0"/>

       <fieldType name="date"class="solr.TrieDateField" precisionStep="0"positionIncrementGap="0"/>

       <!-- 添加IKAnalyzer中文分词器 -->

       <fieldType name="text_ik"class="solr.TextField">  

     <analyzerclass="org.wltea.analyzer.lucene.IKAnalyzer"/>  

       </fieldType>

 

</schema>

 

4,重启solr应用,查看原有的数据:

wKiom1ljGWiQOb_5AAEXPM1efJI894.png

还是原来的那些数据。

5,导入mysql数据到solr中:

选择Dataimport进行导入操作。

wKiom1ljGYOg41CYAAGThZpk9uY205.png

查询:

wKioL1ljGY3zKr9bAAEQ1q5I9q4279.png

证明数据已经导入,并删除了原来的数据!

 

2      删除所有数据

wKiom1ljGZjyxA6ZAADYtu6fAoc281.png

Documents运行/update,指定typexml。先查询后删除:

语句为:

<delete><query>*:*</query></delete>

<commit/>

Submit,执行删除!

wKioL1ljGaSR99_RAACu54iSfgU490.png

当然,上面说的是手动删除,如果要删除的数据很多,想在下一次自动同步数据的时候自动删除指定的数据该如何做呢?

2.1    条件删除solr数据(在增量导入数据的过程中删除)

场景:有一批要拍卖的店铺数据存储在solr中,拍卖的店铺数据有一个拍卖结束时间(endTime),当拍卖结束时间一到,这条存储在solr中的拍卖数据就没有意义了,想要删除这条存储在solr中的数据。

按照上面的手动删除也不是不可以,但这人工操作未免太扯了,到时间人工去solr中删除这条数据耗时又耗力,也不太现实。

解决办法就是:

data-config.xmlentity中添加:

deletedPkQuery="select id from shops where endTime &lt; NOW()"

 

这一句,这句和entiyquery同级,目的是查询出所有店铺数据中结束时间小于当前时间的店铺id,

这个店铺id会和deltaQuery中收集到的id一并执行deltaImportQuery操作,只不过一个是添加数据,一个是删除数据。

 

注意:这个配置在导入数据成功后,无效果。只在导入过程中有效果!

 

3      性能优化

1、  将所有只用于搜索的,而不需要作为结果的field(特别是一些比较大的field)的stored设置为false

2、  将不需要被用于搜索的,而只是作为结果返回的fieldindexed设置为false

3、  删除所有不必要的copyField声明为了索引字段的最小化和搜索的效率;

4、  将所有的 text fieldsindex都设置成false,然后使用copyField将他们都复制到一个总的 text field上,然后进行搜索。



本文转自 wyait 51CTO博客,原文链接:http://blog.51cto.com/wyait/1945906,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
关系型数据库 MySQL
Mysql基础第十二天,用正则表达式进行搜索
Mysql基础第十二天,用正则表达式进行搜索
56 0
Mysql基础第十二天,用正则表达式进行搜索
|
7月前
|
缓存 关系型数据库 MySQL
百度搜索:蓝易云【CentOS8服务器安装MySQL报错:no match mysql-community-server】
现在,你已经成功安装了MySQL服务器并解决了"no match mysql-community-server"的报错问题。祝你使用愉快!
110 1
|
7月前
|
Ubuntu 关系型数据库 MySQL
百度搜索:蓝易云【ubuntu下Mysql安装与root密码重置教程】
请注意,以上步骤是针对Ubuntu系统的。如果你使用的是其他Linux发行版,请相应地调整命令。
162 1
|
7月前
|
关系型数据库 MySQL 数据库
百度搜索:蓝易云【【Docker】Docker部署Mysql并设置数据持久化教程】
通过以上步骤,您已经成功地在Docker中部署了MySQL,并设置了数据持久化,确保数据在容器重新启动或迁移时得以保留。
106 0
|
5月前
|
关系型数据库 MySQL
MySQL 保姆级教程(七):用正则表达式进行搜索
MySQL 保姆级教程(七):用正则表达式进行搜索
|
7月前
|
分布式计算 关系型数据库 MySQL
oceanbase-oracle/mysql 如何导入数据
oceanbase-oracle/mysql 如何导入数据
|
7月前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之在 DataWorks 中使用数据集成从 MySQL 导入数据到 GDB 执行同步任务脚本的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
80 0
|
7月前
|
存储 关系型数据库 MySQL
Python导入Excel数据到MySQL数据库
Python导入Excel数据到MySQL数据库
526 1
|
7月前
|
存储 关系型数据库 MySQL
百度搜索:蓝易云【MySQL的行锁、表锁触发教程】
需要注意的是,行锁和表锁的使用会对数据库的性能产生影响。行锁可以提高并发性,但可能导致死锁问题,而表锁可以简单粗暴地避免死锁,但会降低并发性。因此,在使用锁时需要根据实际情况来选择合适的锁级别。如果需要更精细的并发控制,可以考虑使用行锁,如果对并发性要求不高,可以考虑使用表锁。
61 1
|
7月前
|
关系型数据库 MySQL
Mysql基础第二十一天,全文本搜索
Mysql基础第二十一天,全文本搜索
55 0