本文基于2019.10.25的solr最新版本solr-8.2.0
一、配置MySql连接
1、修改配置文件
第一步,修改core下的conf目录中的solrconfig.xml文件。
这里appDbDisasterShelter是我建立的core,之前有详细讲解过这里就不多说了。例如:D:\solr-8.2.0\server\solr\appDbDisasterShelter\conf。添加如下配置:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
第二步,将连接MySql以及solr导入数据所需要的资源包导入到lib中
- 从solr的源码包的dist目录下(例如,D:\solr-8.2.0\dist)取出两个jar包,solr-dataimporthandler-8.2.0.jar、solr-dataimporthandler-extras-8.2.0.jar;
- mysql-connector-java-5.1.34.jar这个jar包自己去网上下载一个,网上找找就有了。
- 把上述三个jar包放到solr的WEB-INF\lib目录下。例如,D:\solr-8.2.0\server\solr-webapp\webapp\WEB-INF\lib
二、配置core的属性,建立数据库映射
1、修改core下的conf目录中的data-config.xml文件。
例如:D:\solr-8.2.0\server\solr\appDbDisasterShelter\conf,这里appDbDisasterShelter是我建立的core。添加如下配置:
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<!-- 数据库信息 -->
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.1.160:3306/emplus_eos"
user="emt" password="chinaemt"/>
<document>
<!-- document实体 name为数据库表;pk为managed-schema文件中定义的<uniqueKey>id</uniqueKey> -->
<entity name="app_db_disaster_shelter" pk="id"
<!-- 这里只查询数据库中我所需要的字段 -->
query="SELECT `i_id` as id,
`vc_name` as vcName,
`d_longitude` as x,
`d_latitude` as y,
`vc_address` as vcAddress,
`vc_remark` as vcRemark,
concat( d_longitude,' ',d_latitude) as GEO
FROM app_db_disaster_shelter where sys_i_status=0"
<!-- deltaQuery、deletedPkQuery、deltaImportQuery三个方法是用于定时增量同步数据库,这里暂时不讲解,留到后面 -->
deltaQuery="SELECT `i_id` AS `id` FROM `app_db_disaster_shelter` where sys_i_status=0 and
sys_dt_last_update>'${dataimporter.last_index_time}'"
deletedPkQuery="SELECT `i_id` AS `id` FROM `app_db_disaster_shelter` where sys_i_status!='0'"
deltaImportQuery="SELECT `i_id` as id,
`vc_name` as vcName,
`d_longitude` as x,
`d_latitude` as y,
`vc_address` as vcAddress,
`vc_remark` as vcRemark,
concat( d_longitude,' ',d_latitude) as GEO
from app_db_disaster_shelter where sys_i_status=0 and i_id='${dataimporter.delta.id}'">
<!-- 数据库字段映射solr字段 也可以不写,写出来是为了结构清晰,数据库字段和core的属性一一对应 -->
<field column="i_id" name="id"/>
<field column="vc_name" name="vcName"/>
<!-- <field column="i_area_id" name="iAreaId"/> -->
<!-- <field column="vc_dept" name="vcDept"/> -->
<field column="d_longitude" name="x"/>
<field column="d_latitude" name="y"/>
<field column="vc_address" name="vcAddress"/>
<!-- <field column="vc_traffic" name="vcTraffic"/> -->
<!-- <field column="vc_duty_tel" name="vcDutyTel"/> -->
<!-- <field column="vc_fax" name="vcFax"/> -->
<!-- <field column="vc_dept_address" name="vcDeptAddress"/> -->
<!-- <field column="vc_group" name="vcGroup"/> -->
<!-- <field column="dt_update_time" name="dtUpdateTime"/> -->
<field column="vc_remark" name="vcRemark"/>
<!-- <field column="dt_use_time" name="dtUseTime"/> -->
<!-- <field column="vc_basic_situation" name="vcBasicSituation"/> -->
<!-- <field column="d_area" name="dArea"/> -->
<!-- <field column="i_dept_id" name="iDeptId"/> -->
<!-- <field column="i_operate_id" name="iOperateId"/> -->
<!-- <field column="i_status" name="iStatus"/> -->
<!-- <field column="i_extend1" name="iExtend1"/> -->
<!-- <field column="i_extend2" name="iExtend2"/> -->
<!-- <field column="vc_extend1" name="vcExtend1"/> -->
<!-- <field column="vc_extend2" name="vcExtend2"/> -->
<!-- <field column="vc_extend3" name="vcExtend3"/> -->
<!-- <field column="sys_i_status" name="sysIStatus"/> -->
<!-- <field column="sys_dt_create" name="sysDtCreate"/> -->
<!-- <field column="sys_i_create_user" name="sysICreateUser"/> -->
<!-- <field column="sys_dt_last_update" name="sysDtLastUpdate"/> -->
<!-- <field column="sys_i_last_update_user" name="sysILastUpdateUser"/> -->
<!-- <field column="sys_vc_remark" name="sysVcRemark"/> -->
<!-- <field column="i_datasync_unit_id" name="iDatasyncUnitId"/> -->
<!-- <field column="dt_datasync_time" name="dtDatasyncTime"/> -->
<!-- <field column="i_datasync_id" name="iDatasyncId"/> -->
<!-- <field column="origin" name="origin"/> -->
</entity>
</document>
</dataConfig>
2、修改core下的conf目录中的managed-schema文件。
例如:D:\solr-8.2.0\server\solr\appDbDisasterShelter\conf,这里appDbDisasterShelter是我建立的core。添加如下配置:
<!-- name为属性,要和data-config.xml文件中定义的field的name属性一致;type从fieldType的name属性中选择,stored-是否存储;required-是否必须;multiValued-是否多值 -->
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="vcName" type="text_cn" indexed="true" stored="true" required="false" multiValued="false"/>
<field name="x" type="string" indexed="true" stored="true" required="false" multiValued="false"/>
<field name="y" type="string" indexed="true" stored="true" required="false" multiValued="false"/>
<field name="vcAddress" type="string" indexed="true" stored="true" required="false" multiValued="false"/>
<field name="vcRemark" type="string" indexed="true" stored="true" required="false" multiValued="false"/>
<field name="GEO" type="location_rpt" indexed="true" stored="true" required="false" multiValued="false"/>
注意:除了id属性以外,其他属性的required应定义为false,否则数据库字段数据为空时solr会报错
3、报错解决:
实操的时候可能会遇见的问题:
报错:org.apache.solr.common.SolrException: [doc=15378] missing required field: vc_other_tel2
原因:solr导入数据时遇到数据库对应字段的数据为空,解决办法:除主键以外的字段应定义:required=“false”
三、导入数据、测试solr查询
打开solr的主页面,http://ip:port/solr/#/,ip为solr服务所在地址,port为solr服务启动端口,默认8983。
1、dataimport导入数据
步骤我放到截图里
注意:clear复选框表示导入数据并删除solr中有而数据库中不存在的数据
2、Query查询数据
步骤放到截图里
简单介绍一下几个常用查询参数:
- “q”:the quert string,即查询条件,":"表示查询所有内容,支持多个查询条件。
- “fq”:fiter query,即过滤查询,使用Filter Query可以充分利用FilterQuery Cache,提高检索性能。个人觉得可能更多时候用来做区间查询。
- “sort”:sort field or function asc|desc,即根据指定field进行排序。
- “start,rows” Start配置第一条数据初始位置,Rows配置返回结果条数记录。
- “fl”:field list,就是查询结果显示field,多个field用逗号分割。
- “df” default search field,默认查询field。
- “Raw Query Parameters”:就是所有的查询条件,只是查询参数是在URL上而已。
- “wt”: the wite type,即查询结果的显示形式,支持多种个数,json、xml、python、ruby、csv等,最常用的可能还是json或者xml吧。
上面这个几个都是比较常用的查询条件,其他的还有一些,就不再介绍了。
到此,solr导入MySql数据完成。
如果中间出了问题,可以查看solr的日志文件,solr8的日志放在这个文件夹下D:\solr-8.2.0\server\logs
相关的源代码都放在这里:solr整合mysql的实战
上一篇:solr8学习入门(三)创建core,配置中文分词器
下一篇:solr8学习进阶(二)整合springboot实现空间资源搜索