Solr7.5 入门 安装、配置、调用实践

原创
2018/10/22 17:52
阅读数 1.5W

Solr是一个独立的企业级搜索应用服务器,官网地址:https://lucene.apache.org/solr/

从域名我们不难看出,solr是基于lucene的,同时属于apache旗下的组件,今天我们一起学习了解一下solr7.5的安装、使用和java基础调用。

一、下载

进入官网下载页:http://www.apache.org/dyn/closer.lua/lucene/solr/7.5.0

直接下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/7.5.0/

目前最新版本7.5,我们就以这个为安装实例。

下载之后,我们得到一个安装包solr-7.5.0.zip,本示例以windows为例。

二、安装

1.把solr-7.5.0.zip安装文件解压到指定目录

我们可以看到是这样一个目录结构:

bin:启动命令

dist:jar包

example:示例

server:solr的服务相关配置

7.5的solr是自带jetty容器的,我们都不需要tomcat,直接用自带的jetty即可

当然如果你有更多定制化需求,也可以用tomcat做容器。

三、启动

解压了我们就可以直接通过/solr-7.5.0/bin 下的solr进行启动了。

在window下我一般是通过cmd来启动。

打开cmd,进入到对应的bin目录下,执行:

solr start

当你看到如下提示,表示启动成功:

此时我们就可以通过http://127.0.0.1:8983/solr/#/ 访问solr的管理界面了。

是不是觉得太简单了,是的没有比这更简单的了。

但是此时高兴还为时过早。

三、配置

配置主Core

初始化的sorl服务是没有core的,我们需要新建一个。

点击Core Admin,进入以下界面:

默认界面如下,定义你的core名称,点击Add core。

会报一个错误:

 

莫要惊慌,此时我们去安装目录(F:\solr\solr-7.5.0\server\solr)下,可以看到已经新建了一个core目录。

 

报错是因为需要的配置文件不存在,我们去拷贝过来即可。

进入F:\solr\solr-7.5.0\server\solr\configsets\_default 目录下,把conf文件夹copy到

F:\solr\solr-7.5.0\server\solr\new_core 目录下,然后再执行Add core。

然后等待1-2s,会进入以下界面:

此时说明我们的core已经创建成功。

选择新建的core,我们就进入到solr的主要管理界面了。

到此,我们已经成功的搭建好了solr的基本服务。

四、数据库配置

完成以上步骤,我们经历了一个solr服务的从0到有,但是实际上,我们大部分情况下是需要连接数据库来对数据进行索引,然后极大提升我们的查询效率。

如何通过solr连接数据库,把数据索引到solr服务中,我们接着说。

 

1.JAR包准备

1.1 准备mysql连接驱动包,mysql-connector-java-5.1.29.jar,直接maven私服下载或者从自己的项目中获取,这个使用率应该是特别高的。

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

把这3个jar包复制到F:\solr\solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib 目录下,熟悉java的朋友其实看一眼就明白,这其实是一个标准的web项目目录。

2.配置文件准备

进入安装目录,F:\solr\solr-7.5.0\example\example-DIH\solr\db,

复制目录下conf文件夹到F:\solr\solr-7.5.0\server\solr\new_core,覆盖之前的目录.

说明其实创建core的时候,我们就复制过一次,其实大家可以一步到位,第一次就复制F:\solr\solr-7.5.0\example\example-DIH\solr\db的conf文件夹

在conf目录下,我们可以看到很多配置文件如下:

2.1 修改db-data-config.xml

初始化的配置文件如下,这是一个数据库连接池的配置文件,我们需要配置自己的数据库地址和查询sql。

<dataConfig>
    <dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:${solr.install.dir}/example/example-DIH/hsqldb/ex" user="sa" />
    <document>
        <entity name="item" query="select * from item"
                deltaQuery="select id from item where last_modified > '${dataimporter.last_index_time}'">
            <field column="NAME" name="name" />

            <entity name="feature"  
                    query="select DESCRIPTION from FEATURE where ITEM_ID='${item.ID}'"
                    deltaQuery="select ITEM_ID from FEATURE where last_modified > '${dataimporter.last_index_time}'"
                    parentDeltaQuery="select ID from item where ID=${feature.ITEM_ID}">
                <field name="features" column="DESCRIPTION" />
            </entity>
            
            <entity name="item_category"
                    query="select CATEGORY_ID from item_category where ITEM_ID='${item.ID}'"
                    deltaQuery="select ITEM_ID, CATEGORY_ID from item_category where last_modified > '${dataimporter.last_index_time}'"
                    parentDeltaQuery="select ID from item where ID=${item_category.ITEM_ID}">
                <entity name="category"
                        query="select DESCRIPTION from category where ID = '${item_category.CATEGORY_ID}'"
                        deltaQuery="select ID from category where last_modified > '${dataimporter.last_index_time}'"
                        parentDeltaQuery="select ITEM_ID, CATEGORY_ID from item_category where CATEGORY_ID=${category.ID}">
                    <field column="DESCRIPTION" name="cat" />
                </entity>
            </entity>
        </entity>
    </document>
</dataConfig>

以本地Mysql数据库为例,修改配置文件如下:

<dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/solrtest?charactorEncoding=utf-8" user="root" password="root" />
    <document>
        <entity name="student" query="select * from student" pk="id">
            <field column="id" name="id" />
			<field column="name" name="name" />
			<field column="code" name="code" />
			<field column="create_time" name="createTime" />
        </entity>
    </document>
</dataConfig>

配置说明:

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

entity-->sql定义

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

本地数据库如下:

CREATE TABLE `student` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `code` varchar(20) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

2.2 修改managed-schema

进入该配置文件,这个配置文件主要用于配置索引字段。我们在配置文件中增加field,要求一一对应。

    <field name="id" required="true" type="string" indexed="true" stored="true"/>
	<field name="name" type="string" indexed="true" stored="true"/>
	<field name="code" type="string" indexed="false" stored="true"/>
	<field name="createTime" type="pdate" indexed="false" stored="true"/>

注意:我们copy来的配置文件中有一些关键字已经配置了,如id,name,那就不需要重新配置field,只需要配置没有的。

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

并把<uniqueKey>id</uniqueKey>修改成你的主键id值,否则数据导入不进去。

说明:因为只是做个基础的搜索业务,没有精细该schema文件,精益求精的小伙伴可以把冗余字段都干掉试试。

到此,配置完成,接下来我们操作导入数据。

五、数据导入

以上配置完成后,需要重启solr服务。

打开cmd,进入到对应的bin目录下,执行:solr stop -p 8983

服务停止后,我们再执行启动命令:solr start

1.数据导入

启动成功后进入http://127.0.0.1:8983/solr/#/new_core/dataimport//dataimport

或者在主界面点击Dataimport

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

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

右边会显示执行结果,如图所示,导入了4条数据。

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

和我们数据库的数据是刚好对应的。

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

另外,大家配置的时候注意,不需要进行索引或者存储的字段要配置成false,节省资源空间。

<field name="createTime" type="pdate" indexed="false" stored="true"/>

如创建时间,我们不需要进行查询索引,indexed配置成false即可。

2.数据清空

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

输入xml

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

点击Submit Document,结果如下:

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

六、增量更新索引

大家发现没,solr是"一步一个坑",弄完这个,你又得弄另外一个。

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

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

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

1.准备JAR包

这个jar包挺坑的,搜罗了很久,最终也是花积分下载的,本着"天下没有免费的JAR包"的原则,所以大家如果需要该jar包,

请关注微信公众号:

发送"solr"关键字获取百度网盘的下载链接吧(不要打我,为了让你成为我的粉丝,我什么都能做)。

下载了jar包后,把jar包复制放到F:\solr\solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib 目录下

2.修改web.xml配置

F:\solr\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>

这个监听器源码就是来自上面的jar包中,我确认过了。

3.增加dataimport.properties配置

增加增量导入配置文件,注意,目录!目录!目录!

这个文件在F:\solr\solr-7.5.0\server\solr\new_core\conf  有一个,但是,我们不是配置到这里!敲黑板,划重点!

我们需要在F:\solr\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=my_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=delta-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

这个文件说的挺详细的,建议存档理解。因为运行一次之后,这个文件会变成酱紫了,but,我们并不需要care了

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

总算来到"终极BOSS关",我们只需要再配置2个脚本,就KO了,再坚持一下吧。

直接上配置代码吧,简单粗暴一点。

<dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/solrtest?charactorEncoding=utf-8" user="root" password="root" />
    <document>
        <entity name="student" query="select * from student"
			deltaImportQuery="select * from student where id='${dataimporter.delta.id}'"
			deltaQuery="select * from student where `create_time` > '${dataimporter.last_index_time}'" pk="id">
            <field column="id" name="id" />
			<field column="name" name="name" />
			<field column="code" name="code" />
			<field column="create_time" name="createTime" />
        </entity>
    </document>
</dataConfig>

说明:

主要增加了deltaImportQuery和deltaQuery 2个属性,其实这个就是作为增量时的操作sql,solr默认读取这个key值的sql语句。

${dataimporter.delta.id}  这个东东,我没找到具体的定义在哪,但是如果你的主键id配置的不叫id,如叫studentId,那么,这个取变量就应该写成${dataimporter.delta.studentId}

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

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

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

(没错,和前面配置的那个是同名文件,我也不太理解为啥不能共用这一个)

5.重启验证

嗷嗷嗷,总算配置完成,那么赶紧重启一波,验证一把呗。

验证步骤1:重启完服务后,观察solr日志

验证步骤2:去数据库中新建或者修改数据,静静等待你配置的增量时间

数据库修改数据:

等待.........

验证步骤3:查询结果,观察数据是否已经同步

当你看到出现出现如下日志:(日志目录-->F:\solr\solr-7.5.0\server\logs\solr.log)

2018-10-22 10:05:18.234 INFO  (Thread-17) [   ] o.a.s.h.d.DataImporter Starting Delta Import
2018-10-22 10:05:18.235 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [new_core] <index update process> Response message                      OK
2018-10-22 10:05:18.235 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [new_core] <index update process> Response code                 200
2018-10-22 10:05:18.235 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [new_core] <index update process> Disconnected from server              localhost
2018-10-22 10:05:18.236 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [new_core] <index update process> Process ended at ................ 22.10.2018 10:05:18 235

说明增量同步已经执行...

查询solr:

至此,增量同步配置完成!

七、分词技术

分词技术说难不难,说简单吧,感觉有时候又达不到你的需求。

分词我研究的很肤浅,包括权重这块,我都没有太深入,采取的基本配置。

分词,我用的是IK分词器,这个jar包很久没人维护了,索性,在solr7中也是适用的。

1.下载IK分词器jar包

这里也方便大家下载,在我的公号(tanjava)中回复"分词"即可获得分词jar包的百度网盘下载链接。

下载解压后,把ik-analyzer-solr5-5.x.jar 放到F:\solr\solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib 目录下。

2.修改managed-schema文件

修改F:\solr\solr-7.5.0\server\solr\new_core\conf 目录下的managed-schema 文件。

增加分词器的fieldType定义:

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

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

如,type定义为"text_ik",则代表该字段将进行分词索引

<field name="studentName" type="text_ik" indexed="true" stored="true"/>

3.查看

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

如上,说明分词成功。

八、小结

至此,solr服务就全部搭建完成了。

简单回顾一下。

下载安装文件->配置solr->启动。

其实关键在于配置环节,其实个人觉得配置这块如果能界面化,相信solr更容易上手了。

 

九、Java调用接口

solr服务搭建完成,那么如何提供出接口请求访问?

solr有提供java的api,说透了也很简单了。

1.引入pom依赖

<dependency>
    <groupId>org.apache.solr</groupId>
	<artifactId>solr-solrj</artifactId>
	<version>7.5.0</version>
</dependency>

2.写一个solr的工具类

以下是核心方法,从solr查询的数据都会封装在SolrDocumentList返回。

public void solrQuery() throws IOException, SolrServerException {
        String solrUrl = "http://127.0.0.1:8983/solr/new_core";
        HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl).build();
        // 创建搜索对象
        SolrQuery query = new SolrQuery();
        // 设置搜索条件
        query.set("q","name:张三是好人");
        // 分页参数
        query.setStart(0);
		// 设置每页显示多少条
		query.setRows(10);
        //发起搜索请求
        QueryResponse response = solrClient.query(query);
        // 查询结果
        SolrDocumentList docs = response.getResults();
        // 查询结果总数
        long count= docs.getNumFound();
        System.out.println("总条数为"+count+"条");
        for (SolrDocument doc : docs) {
          System.out.println("id:"+ doc.get("id") + ",name:"+ doc.get("name") + ",uuid:"+ doc.get("uuid"));
        }
        solrClient.close();
    }

 

OK,到此,我们的solr从安装,到配置以及最终的到调用,都呈现出来了。

有什么问题欢迎一起探讨。

最后,再打个小广告吧,关注我的公众号,可以随时留言联系。

 

展开阅读全文
加载中

作者的其它热门文章

打赏
9
8 收藏
分享
打赏
5 评论
8 收藏
9
分享
返回顶部
顶部