加入收藏 | 设为首页 | 会员中心 | 我要投稿 驾考网 (https://www.jiakaowang.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

推荐mysql导入数据到solr的方法

发布时间:2023-08-15 14:47:37 所属栏目:MySql教程 来源:
导读:本文主要给大家介绍mysql导入数据到solr的方法,其所涉及的东西,从理论知识来获悉,有很多书籍、文献可供大家参考,从现实意义来讲,亿速云累计多年的实践经验可分享给大家。

1 mysql导入数据到solr

本文主要给大家介绍mysql导入数据到solr的方法,其所涉及的东西,从理论知识来获悉,有很多书籍、文献可供大家参考,从现实意义来讲,亿速云累计多年的实践经验可分享给大家。
 
1      mysql导入数据到solr
 
方式一:创建项目,查询出数据,一条一条add到solr中;(不推荐)
 
方式二:通过配置复制数据到solr中
 
以上已完成了在本地window8中对solr的部署,为solr添加了一个自定义的coredemo,并且引入了ik分词器。
 
那么该如何将本地的mysql的数据导入到solr中呢?
 
1.1    准备工作
 
1.1.1     准备数据源
 
mysql数据源:test库中的user表(7条数据),其中这个update_time字段是用于solr更新数据库数据的依据,表中必须得有这个字段。
 
 mysql导入数据到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驱动jar:mysql-connector-java-5.1.14.jar(这个基本都有)
 
和D:\solr-4.10.2\dist\solr-dataimporthandler-4.10.2.jar
 
mysql导入数据到solr的方法
 
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\conf)conf目录下,并更名为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:获取pk的SQL(增量导入时使用)
 
注意查询条件的写法:${..},如在本例中:
 
${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.jar和solr-dataimporthandler-4.10.2.jar到solr的D:\solr-4.10.2\example\solr-webapp\webapp\WEB-INF\lib目录中;
 
mysql导入数据到solr的方法
 
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应用,查看原有的数据:
 
mysql导入数据到solr的方法
 
还是原来的那些数据。
 
5,导入mysql数据到solr中:
 
选择Dataimport进行导入操作。
 
mysql导入数据到solr的方法
 
查询:
 
mysql导入数据到solr的方法
 
证明数据已经导入,并删除了原来的数据!
 
2      删除所有数据
 
mysql导入数据到solr的方法
 
Documents运行/update,指定type为xml。先查询后删除:
 
语句为:
 
<delete><query>*:*</query></delete>
 
<commit/>
 
Submit,执行删除!
 
mysql导入数据到solr的方法
 
当然,上面说的是手动删除,如果要删除的数据很多,想在下一次自动同步数据的时候自动删除指定的数据该如何做呢?
 
2.1    条件删除solr数据(在增量导入数据的过程中删除)
 
场景:有一批要拍卖的店铺数据存储在solr中,拍卖的店铺数据有一个拍卖结束时间(endTime),当拍卖结束时间一到,这条存储在solr中的拍卖数据就没有意义了,想要删除这条存储在solr中的数据。
 
按照上面的手动删除也不是不可以,但这人工操作未免太扯了,到时间人工去solr中删除这条数据耗时又耗力,也不太现实。
 
解决办法就是:
 
在data-config.xml的entity中添加:
 
deletedPkQuery="select id from shops where endTime < NOW()"
 
这一句,这句和entiy的query同级,目的是查询出所有店铺数据中结束时间小于当前时间的店铺id,
 
这个店铺id会和deltaQuery中收集到的id一并执行deltaImportQuery操作,只不过一个是添加数据,一个是删除数据。
 
注意:这个配置在导入数据成功后,无效果。只在导入过程中有效果!
 
3      性能优化
 
1、  将所有只用于搜索的,而不需要作为结果的field(特别是一些比较大的field)的stored设置为false;
 
2、  将不需要被用于搜索的,而只是作为结果返回的field的indexed设置为false;
 
3、  删除所有不必要的copyField声明为了索引字段的最小化和搜索的效率;
 
4、  将所有的 text fields的index都设置成false,然后使用copyField将他们都复制到一个总的 text field上,然后进行搜索。
 
 

(编辑:驾考网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章