架构之旅-扩展-数据-搜索-Solr

简述

本文中,将配置solr来提供搜索服务,并修改iarc-data来使用solr。

源代码

iarc-data

环境

IDE: IntelliJ IDEA
JDK: 1.8.0_u162
MiddleWare: Solr 7.3.0
App Coordinator: Zookeeper 3.4.10
DB: MySQL

开发

安装solr

官网下载并复制到centos下/opt目录

1
2
3
$ cd /opt
$ tar -zxvf solr-7.3.0.tgz
$ ln -s /opt/solr-7.3.0 /opt/solr

集群配置

$ vim /opt/solr/bin/solr.in.sh, 找到如下配置节并修改

1
2
SOLR_HOST="192.168.56.103"
SOLR_TIMEZONE="UTC+8"

启动/停止 别名

1
2
alias solrstart='/opt/solr/bin/solr start -cloud -p 8983 -s "/opt/solr/server/solr" -z localhost:2181 -force'
alias solrstop='/opt/solr/bin/solr stop'

配置目录

1
2
$ mkdir /opt/solr/conf
$ cp /opt/solr/server/solr/configsets/_default/conf /opt/solr/conf/user -r

上传/更新配置

1
$ /opt/solr/bin/solr zk -upconfig -z localhost:2181 -d /opt/solr/conf/user -n user

删除configset(非必须)

1
http://192.168.56.103:8983/solr/admin/configs?action=DELETE&name=user

基于配置,创建Collection

地址:http://192.168.56.103:8983/solr/#/~collections
操作:add collection
选择:config set - user, 其余为默认

中文分词

复制需要的jar包至webapp

1
cp /opt/solr-7.3.0/contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-7.3.0.jar /opt/solr/server/solr-webapp/webapp/WEB-INF/lib/

修改并更新配置

vim /opt/solr/conf/user/managed-schema, 添加内容如下

1
2
3
4
5
6
7
8
<fieldType name="text_cn" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
</fieldType>

数据导入

复制需要的jar包至webapp

1
2
$ cp /opt/solr/dist/solr-dataimporthandler-* /opt/solr/server/solr-webapp/webapp/WEB-INF/lib/
$ cp /opt/mycat/lib/mysql-connector-java-5.1.35.jar /opt/solr/server/solr-webapp/webapp/WEB-INF/lib/

修改并更新配置

  • $ vim /opt/solr/conf/user/solrconfig.xml, 添加内容如下

    1
    2
    3
    4
    5
    <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
    <str name="config">db-data-config.xml</str>
    </lst>
    </requestHandler>
  • $ vim /opt/solr/conf/user/db-data-config.xml, 内容如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="UTF-8" ?>
    <?xml version="1.0" encoding="UTF-8" ?>
    <dataConfig>
    <dataSource name="ijava" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.56.103:3306/ijava" user="root" password="**" />
    <document>
    <entity name="user" dataSource="ijava" query="select id, name from ijava.user;">
    </entity>
    </document>
    </dataConfig>
  • $ vim /opt/solr/conf/user/managed-schema, 内容如下

    1
    2
    3
    4
    <schema name="user" version="1.6">
    <uniqueKey>id</uniqueKey>
    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="name" type="text_cn" indexed="true" stored="true" required="true" multiValued="false" />

手动导入

地址:http://172.16.0.239:8101/solr/index.html#/user/dataimport//dataimport
选择:full-import - commit , clik Execute
注意:如果点击’Dataimport’仍然提示
“The solrconfig.xml file for this index does not have an operational DataImportHandler defined!”, 可以直接使用 api来导入

1
http://192.168.56.103:8983/solr/user/dataimport?command=full-import&verbose=false&clean=false&commit=true&optimize=false&core=user&indent=on&wt=json

定时导入

crontab -e, 添加内容如下

1
*/5  * * * * curl "http://192.168.56.103:8983/solr/user/dataimport?command=full-import&verbose=false&clean=false&commit=true&optimize=false&core=user&indent=on&wt=json" > /dev/null 2>&1

spring boot使用solr

application.properties

1
2
spring.data.solr.host=http://192.168.56.103:8983/solr
spring.data.solr.repositories.enabled=true

pom.xml

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
<version>1.5.0.RELEASE</version>
</dependency>

solrdocument

1
2
3
4
5
6
7
8
@SolrDocument(solrCoreName = "user")
@Getter
@Setter
public class SolrUser implements Serializable {
@Id
private String id;
private String name;
}

repository

1
2
3
public interface SolrUserRepository extends SolrCrudRepository<SolrUser, String> {
List<SolrUser> findByNameContaining(String name);
}

UserServiceImpl

接口中添加方法getUsersByName

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public List<User> getUsersByName(String name) {
List<SolrUser> users = userRepository.findByNameContaining(name);
List<User> results = new ArrayList<>();
if(users != null) {
users.forEach( user -> {
User usr = new User();
usr.setId(Integer.parseInt(user.getId()));
usr.setName(user.getName());
results.add(usr);
});
}
return results;
}

调试

测试solr colletion的search功能

地址:http://192.168.56.103:8983/solr/#/user/query
位置:Query, q输入框中输入name:*v*, 点击Execute Query

测试使用solr后的service功能

部署

部署到linux下tomcat中

参考数据访问层部署部分

参考