博客信息

solr7.5的基本使用(数据导入,增量索引,中文分词器)

发布时间:『 2019-05-11 02:47』  博客类别:索引框架  阅读(1449)
1.jar包准备

1.1准备mysql连接驱动包,mysql-connector-java-5.1.44-bin.jar这个jar包的使用率是特别高的直接从项目中拷贝一个,或者从maven 本地仓库获取都可以

1.2 找到solr-dataimporthandler-7.5.0.jar和solr-dataimporthandler-extras-7.5.0.jar 。这2个jar在solr安装目录下有solr-7.5.0\dist

1.3把这3个jar包复制到solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib 目录下,这其实是一个标准的web项目目录。

小李飞刀_solr

2.配置文件准备

新建一个db-data-config.xml文件到E:\solr7.5\solr-7.5.0\server\solr\new_core 这个文件是数据库连接池配置文件里面配置,我们需要配置自己的数据库地址和查询sql。

你也可以去E:\solr7.5\solr-7.5.0\example\example-DIH\solr\db\conf下拷贝那个过来修改
<dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/mybatis_ssm?characterEncoding=UTF-8" user="mybatis_ssm" password="xiaoli"  />
    <document>
	 <!--  pk="ID" 这个很有必要,因为其中的增量索引查询主键ID时需要  -->
              <!--  dataSource="mydb"   这个引用名字是引用上面数据源的名字 -->
              <!--  name="myinfo"   这个名字必须唯一,存在多个实体时 -->
               <!--  query="select  *  from myinfo WHERE isdelete=0   query查询是指
               查询出表里所有的符合条件的数据,因为笔者测试的有删除业务,所以
               where  后面有一个限定条件isdelete=0,意思为查询未被删除的数据
               
               (注意这个query查询只对第一次全量导入有作用,对增量导入不起作用)
               -->
               <!--
               deltaQuery="select productId from product where modifyTime > '${dataimporter.last_index_time}'"
               deltaQuery的意思是,查询出所有经过修改的记录的ID
               可能是修改操作,添加操作,删除操作产生的
               (此查询只对增量导入起作用,而且只能返回ID值)
               -->
               <!--
               deletedPkQuery="select productId from product where isdelete=-1" 
               此操作值查询那些数据库里伪删除的数据的ID(即isdelete标识为-1的数据)
               solr通过它来删除索引里面对应的数据
               (此查询只对增量导入起作用,而且只能返回ID值)
               -->
               <!--
                deltaImportQuery="select * from product where productId = '${dih.delta.productId}'"
                次查询是获取以上两步的ID,然后把其全部数据获取,根据获取的数据
                对索引库进行更新操作,可能是删除,添加,修改
                (此查询只对增量导入起作用,可以返回多个字段的值,一般情况下,都是返回所有字段的列)
				
-->
         
		 <entity name="t_solr_blog" query="select * from t_solr_blog" pk="bid">
           <field column="bid" name="bid" />
			<field column="title" name="title" />
			<field column="summary" name="summary" />
			<field column="releaseDate" name="releaseDate" />
			<field column="clickHit" name="clickHit" />
			<field column="replyHit" name="replyHit" />
			<field column="btid" name="btid" />
			<field column="keyWord" name="keyWord" />
			<field column="content" name="content" />
        </entity>
		
    </document>
</dataConfig>

dataSource-->数据库连接,用户名密码配置

entity-->sql定义

field-->字段定义,column对应数据库字段,name对应solr的索引字段名


然后在solrconfig.xml中加入大概在680行左右的位置

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
	<lst name="defaults">
		<str name="config">db-data-config.xml</str>
	</lst>
</requestHandler>

小李飞刀_solr


2.2managed-schema文件的修改(在solr5.5以前是叫schema.Xml的)

修改E:\solr7.5\solr-7.5.0\server\solr\new_core\conf下的managed-schema配置文件在这里添加你的数据库字段

关于这个配置文件的详细解释大家可以去博客https://blog.csdn.net/yjt520557/article/details/85258444

其实也可以直接在文件managed-schema中添加字段不过容易报错所以不推荐而且需要重启生效


2.2控制界面添加

http://localhost:8983/solr/#/new_core/schema

在这里你需要注意id是它本来就配置好的

如果你的表主键id不是叫id,那么你定义的field需要指定required="true",并把默认的id的required="true"属性去掉,

并把<uniqueKey>id</uniqueKey>修改成你的主键id值(这个你需要去文件夹E:\solr7.5\solr-7.5.0\server\solr\new_core\conf下修改),否则数据导入不进去。

小李飞刀_solr


添加好之后在Analysis中可以看到,在你的managed-schema文件中也有对应的字段了你可以通过Files查看也可以到

小李飞刀_solr


E:\solr7.5\solr-7.5.0\server\solr\new_core\conf下查看

小李飞刀_solr


这种操作不需要重启就可以生效,推荐一下

其实也可以直接在文件中managed-schema添加字段不过容易报错所以不推荐而且需要重启生效


3.数据库导入


 小李飞刀_solr




点击Entity,我们发现有我们配置的t_article,勾选中


最后勾选Auto-Refresh Status,点击Excute,


右边会显示执行结果

小李飞刀_solr


进入到Query菜单,执行查询,如图所示,结果如下:

小李飞刀_solr


这与我们的数据库数据是对应的 

小李飞刀_solr

solr中的索引字段名取决于你在managed-schema中如何配置定义。


配置的时候注意一下资源消耗


4.数据清空


进入solr主页,进入Documents模块,如图所示,选择XML类型

输入

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

小李飞刀_solr


点击Submit Document,结果如下:

小李飞刀_solr


此时再去查询,就看到数据都已经清空。

小李飞刀_solr

 


 


5.增量更新索引 


我们有了数据导入,那数据库变化了怎么同步数据?难道每次手动点一点?

答案当然是NO,所以接下来,我们一起了解下如何配置增量更新索引。

增量更新索引,顾名思义就是在原有的数据基础上进行索引更新,不会对已有的数据再进行一次索引。


5.1准备jar包

把apache-solr-dataimportscheduler-1.4.Jar这个jar包放到

E:\solr7.5\solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib下


5.2修改web配置

E:\solr7.5\solr-7.5.0\server\solr-webapp\webapp\WEB-INF

打开web.xml文件,增加监听器配置

<listener>
	 <listener-class>
	    org.apache.solr.handler.dataimport.scheduler.ApplicationListener
	 </listener-class>
   </listener>

5.3增加dataimport.properties配置

在这里大家一定要注意目录结构不要放错了位置;

E:\solr7.5\solr-7.5.0\server\solr目录下新建一个conf文件夹

然后在conf目录下,新建dataimport.properties 文件。


文件内容如下

#################################################
#                                               #
#       dataimport scheduler properties         #
#                                               #
#################################################
 
#  to sync or not to sync
#  1 - active; anything else - inactive
syncEnabled=1
 
#  which cores to schedule
#  in a multi-core environment you can decide which cores you want syncronized
#  leave empty or comment it out if using single-core deployment
#  修改成你所使用的core
syncCores=new_core
 
#  solr server name or IP address
#  [defaults to localhost if empty]
server=localhost
 
#  solr server port
#  [defaults to 80 if empty]
#  安装solr的端口
port=8983
 
#  application name/context
#  [defaults to current ServletContextListener's context (app) name]
webapp=solr
 
#  URL params [mandatory]
#  remainder of URL
#  这里改成下面的形式,solr同步数据时请求的链接
params=/dataimport?command=full-import&clean=false&commit=true
 
#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty]
#这里是设置定时任务的,单位是分钟,也就是多长时间你检测一次数据同步,根据项目需求修改
#  开始测试的时候为了方便看到效果,时间可以设置短一点
interval=1
 
#  重做索引的时间间隔,单位分钟,默认7200,即5天; 
#  为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=7200
 
#  重做索引的参数
reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true
 
#  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
#  两种格式:2012-04-11 01:00:00 或者  01:00:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=01:00:00

5.4.修改db-data-config.xml配置

修改为:

<dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/mybatis_ssm?characterEncoding=UTF-8" user="mybatis_ssm" password="xiaoli"  />
    <document>
	 <!--  pk="ID" 这个很有必要,因为其中的增量索引查询主键ID时需要  -->
              <!--  dataSource="mydb"   这个引用名字是引用上面数据源的名字 -->
              <!--  name="myinfo"   这个名字必须唯一,存在多个实体时 -->
               <!--  query="select  *  from myinfo WHERE isdelete=0   query查询是指
               查询出表里所有的符合条件的数据,因为笔者测试的有删除业务,所以
               where  后面有一个限定条件isdelete=0,意思为查询未被删除的数据
               
               (注意这个query查询只对第一次全量导入有作用,对增量导入不起作用)
               -->
               <!--
               deltaQuery="select productId from product where modifyTime > '${dataimporter.last_index_time}'"
               deltaQuery的意思是,查询出所有经过修改的记录的ID
               可能是修改操作,添加操作,删除操作产生的
               (此查询只对增量导入起作用,而且只能返回ID值)
               -->
               <!--
               deletedPkQuery="select productId from product where isdelete=-1" 
               此操作值查询那些数据库里伪删除的数据的ID(即isdelete标识为-1的数据)
               solr通过它来删除索引里面对应的数据
               (此查询只对增量导入起作用,而且只能返回ID值)
               -->
               <!--
                deltaImportQuery="select * from product where productId = '${dih.delta.productId}'"
                次查询是获取以上两步的ID,然后把其全部数据获取,根据获取的数据
                对索引库进行更新操作,可能是删除,添加,修改
                (此查询只对增量导入起作用,可以返回多个字段的值,一般情况下,都是返回所有字段的列)
				<entity name="t_solr_blog" query="select * from t_solr_blog" pk="bid">
-->
         
		 <entity name="t_solr_blog"  query="select * from t_solr_blog" 
		     deltaImportQuery="select * from t_solr_blog where bid='${dataimporter.delta.bid}'"
			deltaQuery="select * from t_solr_blog where `releaseDate` > '${dataimporter.last_index_time}'"
			pk="bid"
		>
           <field column="bid" name="bid" />
			<field column="title" name="title" />
			<field column="summary" name="summary" />
			<field column="releaseDate" name="releaseDate" />
			<field column="clickHit" name="clickHit" />
			<field column="replyHit" name="replyHit" />
			<field column="btid" name="btid" />
			<field column="keyWord" name="keyWord" />
			<field column="content" name="content" />
        </entity>
		
    </document>
</dataConfig>

${dataimporter.delta.id}指的就是主键如果主键不为id的话就写成你最开始配置的那个<uniqueKey>id</uniqueKey>的值


${dataimporter.last_index_time}  固定写法,更新的判断条件,上一次的修改时间需要大于上一次索引的更新时间


这个参数会自动更新在E:\solr7.5\solr-7.5.0\server\solr\new_core\conf 下的dataimport.properties文件中


 


这个文件长这样,了解一下:

#Sat May 11 06:53:20 UTC 2019
t_solr_blog.last_index_time=2019-05-11 06\:53\:20
last_index_time=2019-05-11 06\:53\:20

5.5重启验证

由于之前清除了数据再去重新建立一次索引,把clean勾选上只要不是第一次都选上

小李飞刀_solr


这是开始查的数据去数据库修改一下

小李飞刀_solr


 数据库修改添加“测试solr增量更新”字样

 然后等待一分钟再查询

小李飞刀_solr


 


6.ik中文分词器


6.1下载ik分词器jar包

把ik-analyzer-solr5-5.x.jar 放到

E:\solr7.5\solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib文件夹下


现在的是7.多的jar 包了我没有积分下载不到所以使用的这个


6.2修改managed-schema文件

修改E:\solr7.5\solr-7.5.0\server\solr\new_core\conf下的managed-schema 文件。加上

<fieldType name="text_ik" class="solr.TextField">
		<analyzer type="index" useSmart="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
		<analyzer type="query" useSmart="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
	</fieldType>

如果在你的分词器的配置中query的时候userSmart为false那么在查询的时候这个列就不会显示

name="text_ik",分词器名称,在后面的filed定义的时候,可以直接引用。

将,type定义为"text_ik",则代表该字段将进行分词索引这里我们给title引用为

小李飞刀_solr


6.3检查配置

进入solr主页,进入Analysis,输入一段汉字,选择text_ik,点击分析可以看到如下结果:

小李飞刀_solr


我们可以看到分词器配置成功了


查询测试结果:

小李飞刀_solr


我们可以看到有明显的分词效果

到这里solr的服务器端搭建就完成了


本篇博客所需jar包

ik中文分词器

https://pan.baidu.com/s/1h2NuHAqWsWGP-Q_HKgHZbg

提取码y6dx


数据导入

apache-solr-dataimportscheduler-1.4.jar 


关键字:     搜索引擎       solr  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有