「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」
1、前言
前段时间,做了个搜索功能,用到了solr,发现还是有很多东西需要学习的,就总结了下,这里给大家分享下,也是供自己后续学习和使用时参考。(PS:虽然知道现在的主流是ES更多些, solr 随着数据量的急剧上升其检索性能和更新索引效率衰退较快,但是由于历史因素,之前的搜索实现都是基于solr的,后面也就继续沿用了)
2、安装solr
这里推荐大家在自己本机上使用docker安装,可以避免一些复杂的依赖环境导致的问题。
# 1、拉取镜像,这里我使用的7.7.2版本,为了保持与生产环境的一致
docker pull solr:7.7.2
# 2、创建挂载目录,这样容器内的数据可以持久化到宿主机(PS:创建完挂载目录,要给予读写权限)
mkdir -p /data/solr/data
# 3、启动容器
docker --name solr -p 8983:8983 -v /data/solr/data:/opt/solr/server/solr -d solr:7.7.2
容器启动成功后,我们就可以通过127.0.0.1:8983来访问solr控制台了。
3、创建Core
要想往solr里添加数据,必须创建core,然后在对应的core里添加document(相当于一条数据)。创建core的方式有两种,一种是通过命令行创建:
#执行如下命令
./solr create_core -c test
#创建成功后的打印信息:
Creating new core 'test'
{
"responseHeader":{
"status":0,
"QTime":1320
},
"core":"test"
}
另一种是在solr控制台中创建,点击Core Admin -> Add Core,填写core的名称、实例文件夹、数据文件夹、config、schema(document的字段类型描述等) 信息即可。
这里有三个配置文件很重要:
<!-- solrconfig.xml -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<!-- 配置文件的路径应该也可以使用绝对路径 -->
<!-- 这个配置文件里主要是数据源的配置 -->
<str name="config">dataConfig.xml</str>
</lst>
</requestHandler>
<!-- managed-schema -->
<!-- 配置ik分词器 -->
<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>
<field name="common_info_id" type="string" indexed="true" stored="true" required="true"/>
<field name="nickname" type="text_ik" indexed="true" stored="true"/>
<field name="type" type="pint" indexed="true" stored="true"/>
<field name="photo_url" type="string" indexed="true" stored="true"/>
<!-- dataConfig.xml 数据源的配置 -->
<dataConfig>
<dataSource
driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://127.0.0.1;DatabaseName=test"
user="test" password="test"/>
<document>
<entity name="test_search" query="select common_info_id, nickname, hyh_type, hyh_photo_url from common_info where check_state = 1" >
<!-- column即数据库中的字段名 -->
<field name="common_info_id" column="common_info_id" />
<field name="nickname" column="nickname" />
<field name="type" column="type"/>
<field name="photo_url" column="photo_url"/>
</entity>
</document>
</dataConfig>
好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊