2019独角兽企业重金招聘Python工程师标准>>>

公司绝大部分的数据是存储在数据库中。假如有一天数据库已经很大了,公司决定将数据导入到索引中,以改善数据检索的效果,该怎么办呢?

Solr 已经为我们准备好了这样的工具,那就是Data Import Handler 。学习了这几天的solr ,感觉solr 的核心就是它的两个配置文件:schema.xml 和solrconfig.xml

第一步:建立数据库表,并插入测试数据。

在测试数据库中建立一张商品表,表的结构如下:

往数据库表中插入一些数据:

第二步:准备相关的JAR 包。

做过数据库开发的童鞋都知道,要想用数据可就需要连接数据库的接口,java上叫JDBC(Java Data Base Connectivity),别的语言也有类似的接口。

那么,这次我们需要两个jar包,分别是solr-dataimporthandler-4.2.0.jarsolr-dataimporthandler-extras-4.2.0.jarmysql-connector-java-6.0.2.jar前两个可以在solr的解压目录下的dist目录中获取,后一个我想大家都可以找到的。

将这两个jar包复制到E:\lucene\luceneData\solr4\server\solr\WEB-INF\lib这个目录下。

第三步:配置导入设置

1. 默认dataImport功能在Solr5中是禁用的,需要在$SolrHome/conf/solrconfig.xml中添加如下配置开启数据导入功能:

<!-- Data import from mysql 要放在<config></config>中哦-->
  <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,所以在solrconfig.xml同级目录下新建这个文件,贴出我的配置,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>  
<dataConfig>   
    <dataSource name="fromMysql"
              type="JdbcDataSource"   
              driver="com.mysql.jdbc.Driver"   
              url="jdbc:mysql://127.0.0.1:3306/jrbac?serverTimezone=UTC"   
              user="root"   
              password="root"/>   
    <document>   
        <entity name="commodity" query="select com_Id,com_Name,com_Title,com_Content,com_Price,com_Number,com_Type,com_SalesVolume,com_Brand,com_ImgURL from jrbac_commodity">
             <field column="com_Id" name="id"/> 
             <field column="com_Name" name="comName"/> 
             <field column="com_Title" name="comTitle"/>
             <field column="com_Content" name="comContent"/> 
             <field column="com_Price" name="comPrice"/> 
             <field column="com_Number" name="comNumber"/> 
             <field column="com_Type" name="comType"/>
             <field column="com_SalesVolume" name="comSalesvolume"/>
             <field column="com_Brand" name="comBrand"/>
             <field column="com_ImgURL" name="comImgurl"/>
        </entity>   
    </document>   
</dataConfig>

其中fromMysql为数据源自定义名称,随便取,没什么约束,type这是固定值,表示JDBC数据源,后面的driver表示JDBC驱动类,这跟你使用的数据库有关,url即JDBC链接URL,后面的user,password分别表示链接数据库的账号密码,下面的entity映射有点类似hiberante的mapping映射,column即数据库表的列名称,name即schema.xml中定义的域名称。

还有些设置项、参数不知道什么意思,后面后会说的。现在只要清楚field这个标签是设置数据库表中的列(column)和Solr中的字段的映射关系的。

第四步:进行数据导入

1. 重启Solr,进入管理页面,选中Dataimport这个选项。如果一切正常会出现如下图所示的界面。

右面的那些代码是你点击Configuration后出现的,是data-config.xml文件中的内容,也是应该首先检查的地方,如果没有这些配置信息,说明数据库导入的配置文件没生效,是solrconfig.xml文件中开启导入功能的地方出错。

2. 开始导入,要注意command参数,它有两个选项,如下图:  full-import:全量导入,它会覆盖原有的索引 delta-import:即增量导入,它会在原有索引的基础上追加

下面的几个多选框含义解释如下: verbose:这个选项设为true的话,会打印导入的一些中间过程的详细信息,有利于调试以及了解内部操作细节 clean:表示是否在导入数据创建索引之前先清空掉原有的索引 commit:表示是否立即提交索引 optimize:表示是否优化索引 debug: 表示是否开启调试模式

3.然后选择需要导入的Entity,点击Execute按钮开始执行数据导入操作,如图:

正常的话就开始进行导入了,如下图

我们可以通过Refresh Status这个按钮刷新状态,如果出现错误或者Fetched一直是0,那就表明有问题了,你要查看日志进行检查。如果导入成功,就会看到下图所示的情况:

查看OverView菜单,会看到文档信息。

在查询中点击Execute Query按钮,就能看到我们导进去并建好索引的信息,更具体的查询用法后面会讲到,下面是默认的查询,显示文档的所有信息。

第五步:较为复杂的字段映射

数据库单表多个字段到solr多值字段

例如我数据库一个表中有关于地址的几个字段,分别是国家、省份、地区这样的字段(sight_place_1, sight_place_2, sight_place_3..)我需要把这几个字段放到solr中一个多值字段sight_place中。

题外话:对于关系型数据库不应该这样建表的,至少要满足第二范式,但这里用mysql只是为了存数据。

其实对于这个需求比较容易实现,修改data-config.xml文件中的entity就行了,配置如下

<field column="sight_place_1" name="sight_place"/>
<field column="sight_place_2" name="sight_place"/>
<field column="sight_place_3" name="sight_place"/>
<field column="sight_place_4" name="sight_place"/>
<field column="sight_place_5" name="sight_place"/>

数据库单表单字段到solr多值字段

前提:数据库中的单字段中的数据包含多值信息,并且用分隔符分开。例如数据库中sight_type字段的值是

sight_name sight_type
故宫 古迹,世界文化遗产,历史建筑,博物馆
<entity name="sight" query="SELECT * FROM sight" transformer="RegexTransformer"><field column="sight_type" name="sight_type" splitBy=","/>
</entity>

这样,导入到sight_type中的数据就是多值的

sight_type{"博物馆","历史建筑","世界文化遗产","古迹"
}

特别注意: entity的属性transformer要为RegexTransformer,字段映射field属性splitBy设置为你的分隔符

数据库中多表联查到solr多值字段

1. 对于熟悉sql语句的人来讲,通过相对复杂的查询语句可以查到任何条件的结果,例如下面要说的 group_concat

select sight_place_1,GROUP_CONCAT(sight_place_2) as subplace FROM sight GROUP BY sight_place_1

这条查询的结果是

sight_place_1 subplace
中国 北京,台湾,江苏,香港,宁夏,陕西

这样就回到了上面的方法了。当然这并不是多表,只是个简单的实例,你可以用更复杂的sql语句实现多表联查。

2. 另外solr也提供了子查询功能,例如下面的实例,更复杂的可以查看官方Wiki

<entity name="comment" pk="id" query="SELECT * FROM comment"><field column="blogpost_id" name="blogpost_id"/><field column="comment_text" name="comment_text" /><entity name="comment_tags" pk="comment_id" query="SELECT * FROM comment_tags WHERE comment_id='${comment.id}'"><field column="tag" name="tag" /></entity>
</entity>

一些问题

不可行:多值字段按照下标取值 本来我想着取多值字段的sight_place的第二个值,就是省份,但最后发现这并不可行,solr中的多值应该就是个无序列表,但却可以发现在查询结果中,先插入的在下面,后插入的在上面,也不是真的无序。但没找到有序访问的方法。下面是关于这个问题的链接

Query specificly indexed value in multivalued field

Query a specific index value in a multivalue field in Solr

答案中建议我们可以用动态域(dynamic field)或者前缀的方式解决。

转载于:https://my.oschina.net/gibbons/blog/1528489

import mysql data to solr4.2.0相关推荐

  1. 未能加载 mysql.data_连接MySQL 提示错误”未能加载文件或程序集“MySql.Data, Version=5.1.4.0, Culture=neutral,……..” | 学步园...

    CodeSmith4.1.3版本连接MySQL 提示错误"未能加载文件或程序集"MySql.Data, Version=5.1.4.0, Culture=neutral,..... ...

  2. MySql.Data.dll 适配.NET 4.0的版本免费下载) 网上找了很久都是要收费的,最后github下载的,链接如下: https://github.com/BingFengHung/MyS

    MySql.Data.dll 适配.NET 4.0的版本免费下载 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中.居左.居右 SmartyPants 创建一个自定义列表 如 ...

  3. MySQL Data Manipulation Statements

    1.CALL Syntax 调用PROCEDURE CREATE PROCEDURE p (OUT ver_param VARCHAR(25), INOUT incr_param INT) BEGIN ...

  4. 3.2.3 Sqoop 数据迁移工具, 导入数据import, MySQL到HDFS/Hive, 导出数据export,增量数据导入, Sqoop job,常用命令及参数

    目录 数据迁移工具 -- Sqoop 第一部分 Sqoop概述 第二部分 安装配置 第三部分 应用案例 第 1 节 导入数据import MySQL 到 HDFS MySQL 到 Hive 第 2 节 ...

  5. .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper

    .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper 參考演示样例代码,例如以下所看到的: /// <summary>/// MySql 数 ...

  6. mysql超详细教程_MySQL8.0.23安装超详细教程

    前言 最近在做一个人脸识别的项目,需要用数据库保存学生信息与前段交互. MySQL的优点 1.mysql性能卓越,服务稳定,很少出现异常宕机. 2.mysql开放源代码且无版权制约,自主性及使用成本低 ...

  7. mysql data文件夹下的ibdata1 文件作用

    这个文件超级大, 查了一下, 大概的作用如下 是储存的格式 INNODB类型数据状态下, ibdata用来储存文件的数据 而库名的文件夹里面的那些表文件只是结构而已 由于mysql4.1默认试inno ...

  8. MySQL 高可用架构 之 MHA (Centos 7.5 MySQL 5.7.18 MHA 0.58)

    目录 简介 环境准备 秘钥互信 安装基础依赖包 安装MHA组件 安装 MHA Node组件 安装 MHA Manager 组件 建立 MySQL 一主三从 初始化 MySQL 启动MySQL 并简单配 ...

  9. Winform中使用Mysql.Data.dll实现连接Mysql数据库并执行sql语句(排除ddl等非法语句的执行)

    场景 Winform中连接Mysql8并查询表中数据进行显示: Winform中连接Mysql8并查询表中数据进行显示_BADAO_LIUMANG_QIZHI的博客-CSDN博客 与上面实现的流程类似 ...

  10. 探索MySql.Data.dll

    ADO.NET Driver for MySQL  MySql.Data.dll是.Net访问MySQL数据库的一个驱动,完全ADO.NET数据访问模式,由MySQL官方提供,有多个版本可选择. 最早 ...

最新文章

  1. docker 开启remote api
  2. java ftp获取文件夹大小,java 用FTPClient 下载文件时不显示总大小?解决方案
  3. 基于TableStore构建简易海量Topic消息队列
  4. 原来微信可以自定义!把这些功能全关闭后 真清爽!
  5. 余额宝存5万2千,为什么每天只有3.6元?
  6. [HNOI2013]题解
  7. 春风十里,Webpower喊营销汪们更聪明地获得理想薪资
  8. vs2003远程调试总结
  9. 模2除法——用非常直观的例子解释
  10. idea中webapp无法添加到mian文件夹中
  11. 自动白平衡(AWB)算法---1,色温曲线
  12. win7安全模式计算机管理在哪里,win7安全模式怎么进
  13. Vue + Element-ui 实现table表格 数据相同项合并
  14. 累计薅走数百万,EOS Dapps已成黑客提款机?
  15. centos liunx升级内核
  16. DB2 SQL语句归纳整理(一)
  17. 阿里校园招聘2017编程题
  18. LinkedList集合基本操作(代码+注释)
  19. n皇后问题-回溯法求解
  20. Win7超级终端查看单片机printf输出

热门文章

  1. php 模板对象,php面向对象--PHP模板 ppt
  2. 雅诗兰黛公司发布2019会计年度企业责任报告,重点介绍公民责任和可持续发展目标进展
  3. 如何编写DTD文档类型定义
  4. 【百度一键分享功能】百度一键分享插件
  5. java学习就去这56个网站论坛(附各种java学习公众号)
  6. a股用计算机模拟走势,一张图揭示抄底A股的机会在这里
  7. t32 emulation debug port failed
  8. git 出现错误fatal: Unable to create ‘project_path/.git/index.lock‘: File exists.
  9. 【Python/Pytorch - Bug】-- TypeError: type numpy.ndarray doesn‘t define _round method
  10. 【python教程入门学习】拒绝反爬虫!教你搞定爬虫验证码