# lg-solr
**Repository Path**: sunli1103_admin/lg-solr
## Basic Information
- **Project Name**: lg-solr
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-21
- **Last Updated**: 2022-03-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 作业说明
#### 课程介绍
> **第七阶段 分布式搜索引擎进阶**
>
> 模块一 引擎工具包Lucene、搜索应用服务器Solr
>
> 本模块将对Lucene倒排索引机制和底层存储结构深入讲解、对搜索服务引擎Solr高级特性进行剖析,并使用SolrCloud+Zookeeper进行集群化管理。
#### 作业内容
> 1. 在MySQL数据中建立lagou_db数据库, 将position.sql中的数据导入到mysql 数据中。
>
> 2. 使用Solr的DIH 将mysql中的数据导入到Solr中。
>
> 3. 使用SpringBoot 访问Solr使用positionName 字段检索职位信息 如果检索到的职位信息不够5条 则需要启用positionAdvantage 查找 美女多、员工福利好 的企业职位信息进行补充够5条。
>
> 提示:
>
> 搜索一次查询不能满足要求时 发起第二次搜索请求。
>
> 作业需求:
>
> 1. 提交导入数据的过程视频 和 案例讲解视频(另:视频要完整)
>
> 2. 提交案例项目代码
>
> sql文件:https://gitee.com/tian_lanlan/java_001/blob/master/%E4%BD%9C%E4%B8%9A%E8%B5%84%E6%96%99/position.sql
#### 软件版本
```
centos-7.7
jdk-11.0.7
mysql-5.7
solr-7.7.3
ik-analyzer-solr7-7.x.jar
apache-tomcat-8.5.58
```
#### 注意问题
1. 数据库需要开启远程访问权限。
2. 注意使用managed-schema。
#### 实现步骤
**1. 导入MySQL数据**
在MySQL数据中建立lagou_db数据库, 将position.sql中的数据导入到mysql 数据中。
**2. 安装Solr**
**安装方式一**(推荐方式二)
1. 解压程序包
```shell
tar -zxvf /root/upload/solr-7.7.3.tgz -C /opt/
```
2. 启动
```shell
cd /opt/solr-7.7.3/bin/
./solr start -force
```
http://192.168.0.111:8983/solr

3. 设置配置文件,创建new_core
```shell
cp -rf /opt/solr-7.7.3/server/solr/configsets/_default/conf /opt/solr-7.7.3/server/solr/new_core/
cd /opt/solr-7.7.3/server/solr/new_core/conf
```
确认new_core创建成功

**安装方式二**(Tomcat方式安装,可以完成数据导入操作,推荐)
1. 安装tomcat
```shell
tar -zxvf /root/upload/apache-tomcat-8.5.58.tar.gz -C /opt
```
2. 拷贝solr应用
```shell
mkdir -p /opt/apache-tomcat-8.5.58/webapps/solr
tar -zxvf /root/upload/solr-7.7.3.tgz -C /opt/
cp -r /opt/solr-7.7.3/server/solr-webapp/webapp/* /opt/apache-tomcat-8.5.58/webapps/solr
```
复制依赖包
```shell
cd /opt/solr-7.7.3/server/lib/
cp -rf ext/* /opt/apache-tomcat-8.5.58/webapps/solr/WEB-INF/lib/
cp -rf metrics-* /opt/apache-tomcat-8.5.58/webapps/solr/WEB-INF/lib/
```
配置solrhome,用于存储solr core的数据及配置文件
创建solrhome存储Solr索引文件
```shell
mkdir -p /opt/solrhome
```
复制server/solr目录下所有内容到solrhome
```shell
cp -rf /opt/solr-7.7.3/server/solr/* /opt/solrhome
rm -rf /opt/solrhome/new_core/
```
3. 配置Tomcat的web.xml
修改复制到tomcat中的Solr项目中的WEB-INF 目录下的web.xml 配置文件
修改solr_home 路径指向我们刚刚创建的solrhome
```shell
vi /opt/apache-tomcat-8.5.58/webapps/solr/WEB-INF/web.xml
```
```xml
solr/home
/opt/solrhome
java.lang.String
```
去掉web.xml中的安全认证
```xml
```
4. 启动tomcat访问测试
修改tomcat的执行权限,然后启动
```shell
cd /opt/apache-tomcat-8.5.58/
chmod -R 777 *
./bin/startup.sh
```

在浏览器上访问solr
http://192.168.0.111:8080/solr/index.html

5. 设置配置文件,创建new_core
```shell
cp -rf /opt/solr-7.7.3/server/solr/configsets/_default/conf /opt/solrhome/new_core/
cd /opt/solrhome/new_core/conf
```
new_core创建成功
http://192.168.0.111:8080/solr

**3. 安装ik中文分词器**
1. 下载分词器
https://github.com/magese/ik-analyzer-solr
将下载好的jar包 `ik-analyzer-solr7-7.x.jar` 放入 tomcat 对应的项目的 `/solr/WEB-INF/lib` 目录中
2. 设置分词器配置文件
在/opt/solrhome/new_core/conf/managed-schema中的 `id`下方添加以下内容:
```xml
```
3. 测试
重启tomcat后,可以在 `new_core` 的 `Analysis` 的 `FieldType` 中选择 `text_ik` 进行测试。

**4. 导入Solr数据**
使用Solr的DIH(dataimport) 将mysql中的数据导入到Solr中。
1. 首先找到solr7.7.3/dist/solr-dataimporthandler-7.7.3.jar 和 solr-dataimporthandler-extras-7.7.3.jar,复制到tomcat/webapp/solr/WEB-INF/lib/下,并且找到相应数据库的驱动包,也同样放到该目录。我这里用的是mysql的驱动包。
```shell
cp /opt/solr-7.7.3/dist/solr-dataimporthandler-7.7.3.jar /opt/apache-tomcat-8.5.58/webapps/solr/WEB-INF/lib/
cp /opt/solr-7.7.3/dist/solr-dataimporthandler-extras-7.7.3.jar /opt/apache-tomcat-8.5.58/webapps/solr/WEB-INF/lib/
cp /root/upload/mysql-connector-java-5.1.48.jar /opt/apache-tomcat-8.5.58/webapps/solr/WEB-INF/lib/
```
2. 将mysql的数据库脚本 执行 向mysql中插入数据。上传脚本到服务器,然后执行脚本。
```shell
mysql> source book.sql
```
3. 找到solr7.7.3/example/example-DIH/solr/db/conf/db-data-config.xml,把其复制到solrhome/new_core/conf/下,并改名为data-config.xml。
```shell
cp /opt/solr-7.7.3/example/example-DIH/solr/db/conf/db-data-config.xml /opt/solrhome/new_core/conf/data-config.xml
```
4. 打开并编辑data-config.xml,完整的配置文件如下
```xml
```
5. 在solrconfig.xml的679行添加如下内容
```xml
data-config.xml
```
6. 在new_core/conf/managed-schema中`_root_`的field下边配置对应的域
```xml
```
7. 重启tomcat,访问solr控制台,找到new_core中的dataimport,点击蓝色的按钮,则开始导入,导入过程依据数量量的大小,需要的时间也不同,可点击右边的Refresh status来刷新状态,可以查看当前导入了多少条。

**5. 使用SpringBoot 访问Solr**
PositionServiceTests.java
```java
package com.lagou.solr;
import com.lagou.solr.entity.Position;
import com.lagou.solr.service.PositionService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.List;
@SpringBootTest
class PositionServiceTests {
@Autowired
private PositionService positionService;
@Test
void query() throws IOException {
List positions = positionService.findPositions("positionName:PHP", false);
positions.forEach(System.out::println);
System.out.println("=========================================");
List morePositions = positionService.findPositions("positionName:PHP", true);
morePositions.forEach(System.out::println);
}
}
```
PositionService.java
```java
package com.lagou.solr.service;
import com.lagou.solr.entity.Position;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@Service
public class PositionService {
@Autowired
SolrClient solrClient;
public List findPositions(String query, Boolean isMore) throws IOException {
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery(query);
solrQuery.setHighlight(true);
solrQuery.addHighlightField("positionName");
solrQuery.setHighlightSimplePre("");
solrQuery.setHighlightSimplePost("");
QueryResponse queryResponse = null;
try {
queryResponse = solrClient.query(solrQuery);
if (queryResponse == null) {
return null;
}
List positions = queryResponse.getBeans(Position.class);
if (isMore) {
if (CollectionUtils.isEmpty(positions) ||
(!CollectionUtils.isEmpty(positions) && positions.size() < 5)) {
solrQuery.setQuery(query + " and positionAdvantage:美女多、员工福利好");
queryResponse = solrClient.query(solrQuery);
positions = queryResponse.getBeans(Position.class);
}
}
Map>> highlightMap = queryResponse.getHighlighting();
for (Position position : positions) {
List list = highlightMap.get(position.getId()).get("positionName");
if (!CollectionUtils.isEmpty(list)) {
position.setPositionName(list.get(0));
}
}
return positions;
} catch (SolrServerException e) {
e.printStackTrace();
}
return null;
}
}
```
Position.java
```java
package com.lagou.solr.entity;
import lombok.Data;
import org.apache.solr.client.solrj.beans.Field;
import java.io.Serializable;
@Data
public class Position implements Serializable {
@Field
private String id;
@Field
private String positionName;
@Field
private String positionAdvantage;
@Field
private String salary;
@Field
private String workYear;
@Field
private String education;
@Field
private String city;
@Field
private String companyName;
@Field
private String publishTime;
}
```
application.yml
```yml
spring:
data:
solr:
host: http://192.168.0.111:8080/solr/new_core
```
pom.xml
```xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.4.RELEASE
com.lagou
solr
0.0.1-SNAPSHOT
solr
Demo project for Spring Boot
11
org.springframework.boot
spring-boot-starter-data-solr
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.boot
spring-boot-maven-plugin
```
数据库数据

#### 测试流程
1. 使用SpringBoot 访问Solr使用positionName 字段检索职位信息。
```java
List positions = positionService.findPositions("positionName:PHP", false);
```
2. 如果检索到的职位信息不够5条 则需要启用positionAdvantage 查找【美女多、员工福利好】的企业职位信息进行补充够5条。
`使用第二个参数控制是否需要补充。补充的场合加入positionAdvantage的匹配条件。`
```java
List morePositions = positionService.findPositions("positionName:PHP", true);
```
```java
public List findPositions(String query, Boolean isMore) throws IOException {
...
List positions = queryResponse.getBeans(Position.class);
if (isMore) {
if (CollectionUtils.isEmpty(positions) ||
(!CollectionUtils.isEmpty(positions) && positions.size() < 5)) {
solrQuery.setQuery(query + " and positionAdvantage:美女多、员工福利好");
queryResponse = solrClient.query(solrQuery);
positions = queryResponse.getBeans(Position.class);
}
}
...
}
```
查询结果

#### 视频讲解
