搜索是项目中常用的功能,对于大数据量的搜索,查询关系型数据库是非常低效的,好在有三方专门用于搜索的工具,常用的搜索解决方案为:
solr基于Lucene实现,本质是一个Java Web项目,并集成了Jetty服务器,Jetty和Tomcat差不多,也是一个JavaWeb容器,我们客户端只需要通过调用solr控制器,solr处理完后返回数据
搜索使用反向索引
将大大提高搜索效率,正向索引与反向索引的区别如下:
solr就是利用了反向索引,将搜索内容分词后,直接和存储内容的索引进行匹配:
solr拥有自己的数据库,以Document
作存储
前面提到过solr是Java Web
项目,所以需要先装好JDK
官网下载:https://solr.apache.org/downloads.html
下载传入服务器后,解压:
tar xvf solr-8.11.2.tgz
移动到/usr/local
目录下:
mv ./solr-8.11.2 /usr/local/
cd /usr/local/solr-8.11.2/bin/
vi solr.in.sh
找到SOLR_ULIMIT_CHECKS
并修改:
SOLR_ULIMIT_CHECKS=false
如果是root
用户,需要加上-force
./solr start -force
启动成功:
访问服务器8983端口可以进入solr的可视化管理界面:
solr安装完后,直接在界面上添加核心会报错,需要进行一些配置
cd /usr/local/solr-8.11.2/server/solr
mkdir test_core
cp -r configsets/_default/conf/ test_core/
instanceDir
需要和上面创建的文件夹名一致,确认信息后,点击Add Core
:
等待创建结束后,下方就可以选择核心了:
solr默认对中文只会按照每个字进行分词:
如果想要获得中文较好的支持,需要使用ik-analyzer.jar
包,下载地址:https://search.maven.org/search?q=com.github.magese,注意对应solr大版本
将下载完后传入服务器,并移动到/usr/local/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib
目录下:
mv ik-analyzer-8.5.0.jar /usr/local/solr-8.11.2/server/solr-webapp/webapp/libs/
上面提到solr使用Document存储,Document包含的属性和属性类型都定义在managed-schemel
中,争对中文的分词,我们需要自定义一个属性并赋予它类型
编辑对应核心的managed-schemel
文件,/usr/local/solr-8.11.2/server/solr/test_core/conf
目录下:
cd /usr/local/solr-8.11.2/server/solr/test_core/conf
vi managed-schema
在schema标签
包裹区域内添加:
<!--定义属性,type表示属性类型 indexed表示是否建立索引 stored表示是否显示给用户-->
<field name="_china_" type="text_ik" indexed="true" stored="true" />
和刚刚导入的jar
包进行关联:
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
cd /usr/local/solr-8.11.2/bin
./solr stop -all
./solr start -force
在界面上使用_china_
进行分词:
标签 | 属性 | 描述 |
---|---|---|
< fieldType/> | | 定义属性类型 |
< field/> | | 定义属性 |
| name | 属性名称 |
| type | 属性的类型 |
| indexed | 该属性是否建立索引,即可以通过分词的词组被查找 |
| stored | 该属性是否需要返回给搜索用户,并不是所有属性都要展示 |
| required | 该属性是否必须 |
| multiValued | 该属性是否为复合属性,即属性中还有其他属性 |
< copyField/> | | 与multiValued搭配使用,用于表示符合属性中使用的多个属性 |
| source | 指定关联的属性名 |
| dest | 指定复合属性名 |
< uniqueKey/> | | 唯一主键属性 |
< dynamicField/> | | 定义动态属性,name通过通配符进行配置,可以表示多个属性 |
接着我们将本地数据库中的数据导入到solr中,使用的是solr的dataimport
,将dept
部门表数据导入,SQL的创建在MyBatis--初入MyBatis中可以找到
在managed-schema
中定义与本地数据库字段相对应的属性:
cd /usr/local/solr-8.11.2/server/solr/test_core/conf
vi managed-schema
默认的一些属性类型可以在界面中查找:
部门表对应的属性:
<field name="deptno" type="pint" indexed="false" stored="true"/>
<field name="dname" type="text_general" indexed="true" stored="true"/>
<field name="loc" type="text_ik" indexed="true" stored="true"/>
在同一个目录下新建配置文件,用于连接数据库以及做数据库字段和属性的映射:
vi data-dept.xml
内容为:
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.42.170:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&tinyInt1isBit=false"
user="root"
password="root"/>
<document>
<entity name="dept" query="select * from dept">
<!--
实现数据库的列和索引库的字段的映射
column 指定数据库的列表
name 指定索引库的字段名字,必须和managed-schema中定义的一样
-->
<field column="deptno" name="deptno"/>
<field column="dname" name="dname"/>
<field column="loc" name="loc"/>
</entity>
</document>
</dataConfig>
vi solrconfig.xml
在config标签
包裹中添加DataImport的使用:
<!-- 配置数据导入的处理器 -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<!-- 加载data-dept.xml -->
<str name="config">data-dept.xml</str>
</lst>
</requestHandler>
还需要将两个jar包导入到\WEB-INF\lib
目录中:
cd /usr/local/solr-8.11.2/dist
cp solr-dataimporthandler-* /usr/local/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib
以及mysql
的数据库驱动,下载后上传到服务器,再移动到\WEB-INF\lib
目录中:
cp mysql-connector-java-8.0.29.jar /usr/local/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib
cd /usr/local/solr-8.11.2/
./solr stop -all
./solr start -force
界面上点击执行:
如果出错,可以查看/usr/local/solr-8.11.2/server/logs/solr.log
的日志:
tail -f solr.log
我这边遇到的是mysql连接不上,修改mysql的user表
,将root用户
的Host
改为%
:
查询下数据,发现已经导入了:
solr内置了集群功能,是基于zookeeper实现的,启动集群非常便利
执行开启集群命令,可以使用-noprompt表示默认配置:
./solr -e cloud [-noprompt] -force
完成后,会创建两个node目录:
./solr start -c -p 8983 -s ../example/cloud/node1/solr/ -force
./solr start -c -p 7574 -z localhost:9983 -s ../example/cloud/node2/solr/ -force