# 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 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0922/035440_db33db28_1712191.png "屏幕截图.png") 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创建成功 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0922/035747_20ab2dd1_1712191.png "屏幕截图.png") **安装方式二**(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 ``` ![输入图片说明](https://images.gitee.com/uploads/images/2020/0922/124643_57c44996_1712191.png "屏幕截图.png") 在浏览器上访问solr http://192.168.0.111:8080/solr/index.html ![输入图片说明](https://images.gitee.com/uploads/images/2020/0922/124525_dfb1e6eb_1712191.png "屏幕截图.png") 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 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0922/130452_0f5ad50b_1712191.png "屏幕截图.png") **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` 进行测试。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1008/183458_0a2d102b_1712191.png "屏幕截图.png") **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来刷新状态,可以查看当前导入了多少条。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0922/230953_07a9ec0c_1712191.png "屏幕截图.png") **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 ``` 数据库数据 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1008/220201_776ebd48_1712191.png "屏幕截图.png") #### 测试流程 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); } } ... } ``` 查询结果 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1008/215750_889e6c33_1712191.png "屏幕截图.png") #### 视频讲解 ![视频讲解](reference/md-videos/solr.mp4)