solr5.5集成IK分词及mysql定时数据同步的开发记录

 

目录

1.前言

2.java环境

2.1 安装jdk

2.1.1 64位安装

2.1.2 32位安装

2.1.3 环境变量

2.1.4 刷新权限

2.1.5 确认安装

3 安装tomcat8

3.1 修改端口号

3.2 设置tomcat-user

3.3 验证tomcat

4.配置solr

4.1 拷贝solr-webap

4.2 拷贝额外jar包

4.3 创建日志文件夹

4.4 创建数据区

4.5 设置solr/home

5.其他配置

6.关键字分词命中

7.清空solr数据

8.手工同步数据

9.自动同步

10.参考文献


1.前言

solr主要用于全文搜索用的,类似我们看到在搜索框输入一个词或者字,就会自动下拉和此相关的记录,并且把关键字高亮的效果大多都是通过solr实现的。有人可能要说,直接用mysql模糊匹配不是就能实现吗?其实却是也是可以实现,在知识库数据量小的情况下,直接like模糊匹配就行了,找到相似的前多少条返回前端进行展示即可,但问题是,一般情况下知识库的内容都不是简单几千条或者几万条,知识库的数据量都是非常大,这时候如果还用like模糊匹配,你会发现简直就是灾难啊。like默认情况下是会扫全表的,这时候查询效率就非常慢,用户体验超级差。但是solr的搜索不同,简单说一下我对solr搜索的理解如下。

solr是对拿到的记录进行分词,将每个词进行保存,并将词和内容建立对应关系,并对此做索引。例如分出两个词A、B,后续如果还有新的文档记录过来也分出有A、B词的话,就会把文档也挂到对应这俩词的文档链表上。当我们输入内容进行查询的时候,会先对内容进行分词,根据词找到词对应的文档链表,然后把记录返回。可以简单理解为词是主键,和文档内容是一对多关系。当然实际的技术实现可能我说的要复杂的多。下面贴两个链接,有兴趣的可以自己去研究看一下。

           solr5.5最好配合tomcat8和jdk8,不然总会发现意想不到的问题。

           下面从环境搭建到solr部署记录下实际项目中关于solr的应用。

2.java环境

2.1 安装jdk

登录需要安装的主机之后,输入命令:uname –i。查看系统信息,如果是i386,则使用jdk-8u11-linux-i586.tar.gz 安装包;如果是x86_64,则使用jdk-8u171-linux-x64.tar.gz 安装包。从jdk安装包目录中拷贝相关安装包到/opt/java目录下进行安装即可。

2.1.1 64位安装

1>.把jdk-6u45-linux-x64.bin拷贝到新建的java目录下
           2>.解压缩:tar zxvf jdk-8u171-linux-x64.tar.gz

2.1.2 32位安装

1>.把jdk-8u11-linux-i586.tar.gz拷贝到java目录下
           2>.解压缩:tar zxvf jdk-8u11-linux-i586.tar.gz

2.1.3 环境变量

cd到根目录,执行:vi /etc/profile
     文件打开后,上下键,移动到底部, 开始插入:

--64位安装  

export JAVA_HOME=/opt/java/jdk1.8.0_171
export JAVA_BIN=/opt/java/jdk1.8.0_171/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

  --32位安装      

export JAVA_HOME=/opt/java/jdk1.8.0_11
export JAVA_BIN=/opt/java/jdk1.8.0_11/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

输入完毕,Esc,然后输入  :wq  保存退出

2.1.4 刷新权限

执行:. /etc/profile

2.1.5 确认安装

 命令行输入:java –version,查看版本,显示如下,则说明安装成功。

3 安装tomcat8

拷贝apache-tomcat-8.0.52.tar.gz至/opt/solr目录下,执行tar zxvf apache-tomcat-8.0.52.tar.gz 解压成功,修改apache-tomcat-8.0.52为tomcat-solr。

3.1 修改端口号

打开/opt/solr/tomcat-solr/conf/server.xml   修改默认8080端口为8007  修改AJP默认8009端口为8091

3.2 设置tomcat-user

打开/opt/solr/tomcat-solr/conf/tomcat-users.xml 在</tomcat-users>这一行上面新增如下行:
         

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="solr" password="solr_lzy" roles="manager-gui,manager-script,manager-jmx,manager-status"/>

最后一行是设置的用户solr,密码solr_lzy的用户具备这些访问权限。

3.3 验证tomcat

进入到tomcat-solr/bin/目录下,执行:./startup.sh
浏览器中输入:http://ip:8007 显示如下页面,则说明正常。

如果想查看tomcat中应用的状态,点击Server status,输入前面配置的用户名、密码既可以登录查看。tomcat验证成功之后,./shutdown.sh停止tomcat,然后进行后续操作。

4.配置solr

4.1 拷贝solr-webap

    复制solr-5.5.5/server/solr-webapp/webapp到tomcat下的webapps目录下,改名为solr。
    切换到 /opt/solr 目录下,执行:
    cp -r solr-5.5.5/server/solr-webapp/webapp tomcat-solr/webapps/solr

4.2 拷贝额外jar包

    把额外jar下的jar文件全部拷贝到 tomcat-solr/webapps/solr/WEB-INF/lib/ 目录下
    把将solr-5.5.5/server/lib/ext/目录下的所有jar包复制到tomcat-solr/webapps/solr/WEB-INF/lib/下。

    额外jar报主要包括几部分:

    IKAnalyzer2012FF_u2.jar   IK分词的jar包,亲测solr5.5可用

    pinyin4j-2.5.0.jar  pinyinAnalyzer4.3.1.jar  拼音分词搜索用到的jar

    solr-dataimportscheduler-1.1.1.jar   mysql自动同步用的jar,亲测solr5.5可用

    额外jar点我去下载

4.3 创建日志文件夹

    在opt/solr目录下新建solr-log目录,用来存放solr相关日志信息。

4.4 创建数据区


    将solr-5.5.0/server/solr目录复制到/opt/solr/solrhome 目录下,这个就是传说中的solr/home(存放检索数据)
    切换到opt/solr目录下,执行:cp -r solr-5.5.5/server/solr solrhome

4.5 设置solr/home

编辑tomcat-solr/webapps/solr/WEB-INF/web.xml文件,一下部分是注释的,把注释去掉。solr在启动的时候会去这个根目录加载相关信息。
          

<env-entry>
   <env-entry-name>solr/home</env-entry-name>
   <env-entry-value>/opt/solr/solrhome</env-entry-value>
   <env-entry-type>java.lang.String</env-entry-type>
</env-entry>


5.其他配置

其他配置主要是关于ik分词和log4j的配置文件,ik分词可以配置关键词字典和停用词字典。log4j配置文件可以配置solr服务运行时候的log日志目录。

6.关键字分词命中

目前solr搜索是基于IKAnalyzer做的中文分词,基础词库内容都是常用的词库,例如人民日报内容等。而和业务紧密关联的知识库内容未必能达到很好的分词效果, 因为有些词在词库中并没有,因此单纯的部署发布后,对于特定词的查询可能无法达到既定的目标要求。

例如:有一条知识库记录的标题为:时代花世界的联系方式什么?我们可能想根据“时代”、“花世界”进行搜索查询,但是默认情况下IK分词无法把“花世界”这样的结果分出来,就造成查询效果不佳的情况。同样的,我们可能不需要“什么”这样的词,但是Ik默认会把他分出来,此时可以通过配置停用词字典来过滤掉不需要的词,增加分词准确性和搜索的精准度。

IK分词支持自定义维护字典和停用词字典的功能,具体操作可以参考部署手册中的说明,对不同项目中不同业务情况下的知识库信息进行关键词库和停用词库的配置。

7.清空solr数据

在浏览中输入:http://localhost:8007/solr/index.html ,在左侧菜单,选择core1->Documents,然后选择/update,type选择xml,输入一下内容:

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

然后执行就完成清空操作。具体如下图所示:

8.手工同步数据

在左侧菜单中,选择core1->Dataimport,然后选择full-import,Entity选择wiki,然后点击Execute,等Refresh Status 变色后,点击刷新,就可以从右侧看到导入的信息。具体如下图所示:

9.自动同步

关于自动同步的设置,网上很多,之所以回过头来补充,是因为之前自己做的自动同步方案不生效。主要原因在于data-config.xml文件设置的不对,重新调整后xml如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
			driver="com.mysql.jdbc.Driver"
			url="jdbc:mysql://localhost:3306/crm"
			user="usr"
			password="usr"/>
<document>
	<entity pk="id"
	        name="wiki" 
	        query="SELECT id,title,content FROM wiki"
			deltaQuery="select id from wiki where update_time > '${dataimporter.last_index_time}'"
			deltaImportQuery="select id,title,content from wiki where id='${dih.delta.id}'"
			>
		<field column="id" name="id" />
		<field column="title" name="wiki_title" />
		<field column="content" name="wiki_content" />
	</entity>
</document>
</dataConfig>

重点注意:

query

full-import  全量查询时候要用的,也就是重建索引时候会查询这个。

deltaQuery

这个是查询有哪些是增量更新的记录id

deltaImportQuery 

delta-import时候插入哪些增量更新的记录。

网上关于dih自动同步,增量更新的博客很多,这里不再过多赘述,仅仅记录自己使用时候的新认识。区分一下{dih.delta.id}和${dataimporter.delta.id},它们是一样的,如果设置了pk,就使用dih,否则直接使用dataimporter。

10.参考文献

【1】solr全文检索原理解释非常好的博文

【2】solr和Mysql查询效率对比的博文

【3】solr5.5自动同步mysql数据非常的博文

【4】非常好的solr部署安装入门博文

【5】Solr(七)DIH增量导入和设置定时

【6】Solr学习(五)DIH增量、定时导入并检索数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值