一、入门
1、下载windows版本的solr.zip文件,解压在一个文件名不包含空格的文件夹下,命令行输入sorl启动命令。这时候计算机正在运行Solr,浏览器访问localhost:8983/solr跳转到Solr的管理界面。
–>在后台solr启动一个为jetty的java web 服务器,端口为8983,Solr是运行在Jetty上的web应用程序。–>每台jetty服务器上都有一个solr的主目录,通过java系统属性solr.home.home进行配置。
再回到solr上,每个solr中又可以有多个core(内核,可以理解为java中的一个实例),每个内核中又有包含本内核配置信息的单独目录。
sole主目录:
1、solrconfig.xml是内核的主要配置文件。
2、schema.xml是对内核进行文本分析和索引的主要配置文件
3、example-DIH一个具备了DIH属性的特殊内核,在example目录下的multiply提供了多内核配置信息。
4、lang:语言信息文件
5、data:关于内核lucence索引文件。
注:本次是使用单节点启动(sorl还支持双节点集群启动)
2、解压文件,控制台输入bin\solr.cmd start -p(指定端口号,默认为8983),即可运行,访问localhost:8983可见尚无core(内核),输入bin\sorl create -c(core)创建一个core实例
启动时bin\sorl.cmd start -e 后可启sorl内置示例如:cloud 、techproducts
看到happy search sorl启动成功
3、建立索引
schema的部署:有直接更改xml文件但是需要重新加载,现在多采用修改schema.api的方式,不会造成配置信息丢失的情况。(windows情况下采用postman运行接口的方式)
在配置过schema.xml以及solrconfig.xml和MyDataConfig.xml文件之后,访问时候出现了无法加载mycore中的solrconfig.xml文件的问题。
估计是当初建立新核心或者修改配置文件信息时候出问题了,把solrconfig文件重新复制一份,并添加一个requestHandler.在运行时候错误从无法加载变为找不到dataimport这个jar包。查阅资料发现这个jar包安装时存放在dist 目录下,拷贝一份存在mycore中的webApp下的web_INF下lib文件中重新启动solr已经可以正常访问并显示数据。
如下:
到此,数据应该是已经正确导入。
访问solr的管理界面点击query验证数据是否真正导入成功,q中的参数时*:*代表查询全部索引,fq:代表指定参数。点击运行查看返回的索引集合,params里面是空的。这时候我在想core中的两个配置文件我都配了几遍应该没有问题,那么manage-schema(schema.xml)文件是不是也要配置呢?
关于manage-schema:内含三个重要元素
1、fieldtype:定义分词器类型。
2、analyzer:分词器,决定着检索使用的算法。
3、field:存储索引的字段。
为了适应企业化生产方式,统一采用 schema API统一管理,如果你想修改架构API提供了一系列命令,最常见的增加删除和替换如下(其他命令请参考官网http://lucene.apache.org/solr/guide/7_4/schema-api.html#modify-the-schema):
add-field:添加包含您提供的参数的新字段。
在add中你可以设定一个"name"(存储字段)和"type"(字段类型)。
delete-field:删除一个字段。
replace-field:使用配置不同的字段替换现有字段。
虽然postman 中使用接口对schema已经成功配置,但是在对solr服务器发送请求时候,对基础数据查询时,params结果仍然为0(尝试修改数据类型?究竟数据库中数据类型对应的是MyDataConfig.xml中的数据类型还是postman中传入的数据类型。)
分词器:
先去下载ik中文分词器,解压后将其中的jar包文件和配置文件分别放在web-app中的lib文件和classes文件中。
重启solr点击核心下的analyzer之后输入数据 选择分词器、点击执行如下为分词器效果图:
对manage-schema文件的配置,参考了前辈的说法,一共有三种配置方式1、官方推荐使用postman对manage-api访问从而达到无需重启的配置目的、2、直接修改manage-schema配置文件,需要重启。3、从solr的管理界面直接添加。无需重新启动?注意不能重复添加索引,否则报错(add、delete、replace语句前文有做说明)。
添加数据时,使用solr管理界面dataimport选择full-import、clean、commit记住千万点击执行然后点击刷新数据即可显示已经导入数据。如图所示:
导入数据总结:
1、建立基础数据。
2、在mycore中的mydataconfig.xml文件中配置相关字段信息
3、为manage-schema文件配置索引字段信息(包括name type stored indexed四个重要属性),有三种配置方式:直接配置,postman访问接口、solr管理界面添加。
4、配置solrconfig.xml文件,用来加载dataimport requestHandler驱动和mysql的驱动,从而达到导入你在数据库中存的那些基础数据。
wanchne完成这四步,建议重启solr,规避上述三个配置文件丢失的问题。
最后两部都是可以在solr的管理界面实现,参照截图。
4.solr跨表(同一个数据库中无关联的两张表)建立索引
(有很多种方式)
修改mycore中的mydataconfig.xml文件,加入一个实体user1.重启solr,在管理界面重新导入数据查询结果如下(前提是正确添加索引):
4 5两条数据是user1表中数据搜索得到,为了防止索引覆盖,这里手动添加了user1的主键。
显然,当主键采用自增方式自动生成必然会存在因为主键一直带来的索引覆盖问题——后增加的索引覆盖先增加的索引。如下:
解决方式:
1、主键使用uuid方式生成。
2、手动修改schema.xml在fieldtype标签中添加索引字段,字段名重复的无需添加。
关联查询,修改mydataconfig.xml文件,在entity里面嵌入一条entity query后面写具体的业务逻辑对应的sql语句如:
query=“select id,courseName from tj_course where isDelete=0 and
courseAuditState=1 and studentId=’${tj_student.id}’”
mydataconfig文件:
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/manage" user="root" password="1234"/>
<document>
<entity name="user" pk="id" query="select * from user">
<field column="id" name="id"/>
<field column="name" name="name"/>
<field column="age" name="age"/>
<field column="address" name="address"/>
<field column="description" name="description"/>
</entity>
<entity name="user1" pk="id" query="select * from user1">
<field column="id" name="id"/>
<field column="hobby" name="hobby"/>
</entity>
</document>
</dataConfig>
5、跨数据库(子库)建立索引:
其他和跨表类似,修改mydatacofig.xml文件中的数据源字符串即可:
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource name="source1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/manage" user="root" password="1234"/>
<dataSource name="source2" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/boot_crm" user="root" password="1234"/>
<document>
<entity name="user" dataSource="source1" pk="id" query="select * from user">
<field column="id" name="id"/>
<field column="name" name="name"/>
<field column="age" name="age"/>
<field column="address" name="address"/>
<field column="description" name="description"/>
</entity>
<entity name="span" dataSource="source2" pk="id" query="select * from span">
<field column="id" name="id"/>
<field column="hobby" name="hobby"/>
</entity>
</document>
</dataConfig>
重启solr,导入数据,搜索如下:
前三条是数据库manage中的user表,最后一条来自boot_crm中的user1表。