配置solr的maven坐标

1 springboot整合solr的maven配置如下

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

2 在application.yml配置文件中配置solr的Host地址

  1. spring:
  2. data:
  3. solr:
  4. host: http://localhost:8081/solr/demo_core

3 准备实体类

这个实体类就是solr服务器的配置文件配置的字段。@Field注解是映射作用,Java实体类与solr索引的映射。

  1. package com.datago.microservice.kb.server.entity;
  2. import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  3. import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  4. import io.swagger.annotations.ApiModelProperty;
  5. import lombok.Data;
  6. import org.apache.solr.client.solrj.beans.Field;
  7. import java.io.Serializable;
  8. /**
  9. * @author xq
  10. * @date 2022/03/22 16:33
  11. * @describe 全文检索知识库
  12. */
  13. @Data
  14. public class Knowledge implements Serializable {
  15. private static final long serialVersionUID = 1L;
  16. @Field("id")
  17. private String id;
  18. /**
  19. * 标题
  20. */
  21. @ApiModelProperty(value = "标题")
  22. @Field("title")
  23. private String title;
  24. /**
  25. * 分类ID
  26. */
  27. @ApiModelProperty(value = "分类ID")
  28. @JsonSerialize(
  29. using = ToStringSerializer.class
  30. )
  31. @Field("category_id")
  32. private String categoryId;
  33. /**
  34. * 内容
  35. */
  36. @ApiModelProperty(value = "内容")
  37. @Field("content")
  38. private String content;
  39. /**
  40. * 是否置顶,0-不置顶,1-置顶
  41. */
  42. @ApiModelProperty(value = "是否置顶,0-不置顶,1-置顶")
  43. @Field("is_top")
  44. private Integer isTop;
  45. /**
  46. * 附件ID集合
  47. */
  48. @ApiModelProperty(value = "附件ID集合")
  49. @Field("attach_ids")
  50. private String attachIds;
  51. /**
  52. * 标签IDS
  53. */
  54. @ApiModelProperty(value = "标签IDS")
  55. @Field("label_ids")
  56. private String labelIds;
  57. /**
  58. * 可见范围
  59. */
  60. @ApiModelProperty(value = "可见范围")
  61. @Field("visible_range")
  62. private String visibleRange;
  63. /**
  64. * 发布时间
  65. */
  66. @ApiModelProperty(value = "发布时间")
  67. @Field("release_time")
  68. private String releaseTime;
  69. /**
  70. * 关联模块:(1.元数据、2.数据标准、3.数据质量、4.需求管理)
  71. */
  72. @ApiModelProperty("关联模块:(1.元数据、2.数据标准、3.数据质量、4.需求管理)")
  73. @Field("association_module")
  74. private String associationModule;
  75. @ApiModelProperty("创建人")
  76. @Field("create_user")
  77. private String createUser;
  78. @ApiModelProperty("业务状态")
  79. @Field("status")
  80. private Integer status;
  81. /**
  82. * 类别祖籍列表
  83. */
  84. @ApiModelProperty(value = "是否删除")
  85. @Field("is_deleted")
  86. private Integer isDeleted;
  87. /**
  88. * 创建人名称
  89. */
  90. @ApiModelProperty(value = "创建人名称")
  91. @Field("create_user_name")
  92. private String createUserName;
  93. /**
  94. * 标签集合
  95. */
  96. @ApiModelProperty(value = "标签集合")
  97. @Field("label")
  98. private String label;
  99. /**
  100. * 标签名集合
  101. */
  102. @ApiModelProperty(value = "标签名集合")
  103. @Field("label_name")
  104. private String labelName;
  105. /**
  106. * 类别名称
  107. */
  108. @ApiModelProperty(value = "类别名称")
  109. @Field("category_name")
  110. private String categoryName;
  111. /**
  112. * 类别祖籍列表
  113. */
  114. @ApiModelProperty(value = "类别祖籍列表")
  115. @Field("category_ancestors")
  116. private String categoryAncestors;
  117. /**
  118. * 置顶时间
  119. */
  120. @ApiModelProperty(value = "置顶时间")
  121. @Field("top_time")
  122. private String topTime;
  123. /**
  124. * 创建部门
  125. */
  126. @ApiModelProperty(value = "创建部门")
  127. @Field("create_dept")
  128. private String createDept;
  129. /**
  130. * 创建部门名称
  131. */
  132. @ApiModelProperty(value = "创建部门名称")
  133. @Field("create_dept_name")
  134. private String createDeptName;
  135. /**
  136. * 创建时间
  137. */
  138. @ApiModelProperty(value = "创建时间")
  139. @Field("create_time")
  140. private String createTime;
  141. /**
  142. * 修改时间
  143. */
  144. @ApiModelProperty(value = "修改时间")
  145. @Field("update_time")
  146. private String updateTime;
  147. /**
  148. * 修改人名称
  149. */
  150. @ApiModelProperty(value = "修改人名称")
  151. @Field("update_user")
  152. private String updateUser;
  153. /**
  154. * 修改人名称
  155. */
  156. @ApiModelProperty(value = "修改人名称")
  157. @Field("update_user_name")
  158. private String updateUserName;
  159. /**
  160. * 关联模块:(1.元数据、2.数据标准、3.数据质量、4.需求管理)
  161. */
  162. @ApiModelProperty("关联模块:(1.元数据、2.数据标准、3.数据质量、4.需求管理)")
  163. @Field("association_module_name")
  164. private String associationModuleName;
  165. /**
  166. * 是否收藏,0-未收藏,1-已收藏
  167. */
  168. @ApiModelProperty(value = "是否收藏,0-未收藏,1-已收藏")
  169. @Field("is_collect")
  170. private Integer isCollect;
  171. /**
  172. * 平均分
  173. */
  174. @ApiModelProperty(value = "平均分")
  175. @Field("avg_score")
  176. private Double avgScore;
  177. @ApiModelProperty(value = "内容")
  178. @Field("content_text")
  179. private String contentText;
  180. }

4 注入SolrClient对象

用法示例如下

  1. /**
  2. * solr服务
  3. */
  4. protected SolrClient solrClient;
  5. @Autowired
  6. public void setSolrClient(SolrClient solrClient) {
  7. this.solrClient = solrClient;
  8. }

4.1 springboot添加solr索引库(给solr数据库添加数据)

  1. public void addData() throws Exception{
  2. Products products=new Products();
  3. products.setPid("557");
  4. products.setPname("可爱的胖");
  5. products.setCatalogName("京东");
  6. products.setPrice(80.90);
  7. products.setDescription("很乖的宠物");
  8. products.setPicture("test.jpg");
  9. UpdateResponse updateResponse = solrClient.addBean(products);
  10. solrClient.commit();
  11. System.out.println("添加成功");
  12. }

4.2 springboot修改和上述的添加一样,有就修改,没有就添加

4.3 springboot删除solr索引库

  1. public void delData() throws Exception{
  2. solrClient.deleteById("890");
  3. solrClient.commit();
  4. // solrClient.deleteByQuery("*:*");//先查询然后删除,*:* 这里查询条件是全部,因此执行之后会清空索引库
  5. System.out.println("删除成功");
  6. }

4.4 springboot查询solr索引库的数据

  1. public void select() throws Exception{
  2. SolrQuery solrQuery=new SolrQuery("*:*");//查询所有
  3. QueryResponse query = solrClient.query(solrQuery);
  4. long numFound = query.getResults().getNumFound();
  5. System.out.println("总记录数:"+numFound);
  6. List<Products> beans = query.getBeans(Products.class);
  7. for(Products product:beans){
  8. System.out.println(product.getPid()+" "+product.getPname()+" "+product.getDescription());
  9. }
  10. }

4.5 模仿京东条件筛选搜索

  1. public void moreSelect() throws Exception{
  2. SolrQuery solrQuery=new SolrQuery();
  3. //q
  4. solrQuery.set("q","prod_pname:衣服");
  5. //fq:过滤查询
  6. solrQuery.setFilterQueries("prod_catalog_name:京东");
  7. // 多条件过滤
  8. // solrQuery.setFilterQueries("prod_catalog_name:京东 or prod_catalog_name:淘宝");
  9. //价格过滤
  10. // solrQuery.addFilterQuery("prod_price:[10 TO *]");
  11. //排序sort
  12. // solrQuery.addSort("prod_price",SolrQuery.ORDER.asc);
  13. //分页(规则和limit一样)
  14. solrQuery.setStart(0);
  15. solrQuery.setRows(5);
  16. //回显(想查出来哪几个字段)
  17. // solrQuery.setFields("prod_name","pid");
  18. //高亮配置
  19. solrQuery.setHighlight(true);//启动高亮
  20. solrQuery.addHighlightField("prod_pname");//设置域名称
  21. solrQuery.setHighlightSimplePre("<font color='red'>");
  22. solrQuery.setHighlightSimplePost("</font>");
  23. QueryResponse query = solrClient.query(solrQuery);
  24. //得到高亮数据
  25. Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();
  26. long numFound = query.getResults().getNumFound();
  27. System.out.println("总记录数:"+numFound);
  28. List<Products> beans = query.getBeans(Products.class);
  29. for(Products product:beans){
  30. Map<String, List<String>> stringListMap = highlighting.get(product.getPid());
  31. List<String> prod_pname = stringListMap.get("prod_pname");
  32. String pname = prod_pname.get(0);
  33. product.setPname(pname);//把名称重新赋值为高亮样式的名称
  34. System.out.println(product.getPid()+" "+product.getPname()+" "+product.getCatalogName());
  35. }
  36. }

5 Solr工具

5.1 solr service

  1. package com.datago.microservice.kb.server.service;
  2. import com.datago.microservice.kb.server.enums.SolrQueryEnum;
  3. import org.apache.solr.client.solrj.SolrQuery;
  4. import org.apache.solr.client.solrj.SolrServerException;
  5. import org.apache.solr.client.solrj.response.QueryResponse;
  6. import org.apache.solr.common.SolrInputDocument;
  7. import java.io.IOException;
  8. import java.util.List;
  9. import java.util.Map;
  10. /**
  11. * @author xq
  12. * @date 2022/02/16 11:24
  13. * @describe
  14. */
  15. public interface BaseSolrService<T> {
  16. String OR = " OR ";
  17. String AND = " AND ";
  18. String REGEX = "%s";
  19. String KEY = "id";
  20. String KEY_FIELD = "id:";
  21. String DOCS = "docs";
  22. String RESPONSE = "response";
  23. String START = "start";
  24. String NUMBER_FOUND = "numberFound";
  25. String ROWS = "rows";
  26. String OPEN = "(";
  27. String CLOSE = ")";
  28. String IS_HIGH = "isHigh";
  29. /**
  30. * 插入
  31. *
  32. * @param document 数据导入
  33. * @throws IOException IO异常
  34. * @throws SolrServerException solr服务异常
  35. */
  36. void insert(SolrInputDocument document) throws IOException, SolrServerException;
  37. /**
  38. * 插入
  39. *
  40. * @param core 核心
  41. * @param document 数据导入
  42. * @throws IOException IO异常
  43. * @throws SolrServerException solr服务异常
  44. */
  45. void insert(String core, SolrInputDocument document) throws IOException, SolrServerException;
  46. /**
  47. * 插入
  48. *
  49. * @param core 核心
  50. * @param document 数据导入
  51. * @throws IOException IO异常
  52. * @throws SolrServerException solr服务异常
  53. */
  54. void insertBatch(String core, List<SolrInputDocument> document) throws IOException, SolrServerException;
  55. /**
  56. * 插入
  57. *
  58. * @param core 核心
  59. * @param t 数据实体
  60. * @throws IOException IO异常
  61. * @throws SolrServerException solr服务异常
  62. */
  63. void insertBean(String core, T t) throws IOException, SolrServerException;
  64. /**
  65. * 修改
  66. *
  67. * @param t 数据实体
  68. * @throws IOException IO异常
  69. * @throws SolrServerException solr服务异常
  70. */
  71. void update(T t) throws IOException, SolrServerException;
  72. /**
  73. * 删除
  74. *
  75. * @param query 条件
  76. * @throws IOException IO异常
  77. * @throws SolrServerException solr服务异常
  78. */
  79. void delete(String query) throws IOException, SolrServerException;
  80. /**
  81. * 根据条件删除
  82. *
  83. * @param core 核心
  84. * @param query 条件
  85. * @throws IOException IO异常
  86. * @throws SolrServerException solr服务异常
  87. */
  88. void delete(String core, String query) throws IOException, SolrServerException;
  89. /**
  90. * 删除
  91. *
  92. * @param core 核心
  93. * @param query 条件
  94. * @throws IOException IO异常
  95. * @throws SolrServerException solr服务异常
  96. */
  97. void delete(String core, List<String> query) throws IOException, SolrServerException;
  98. /**
  99. * 查询(返回指定类型)
  100. *
  101. * @param collection 核心
  102. * @param solrQuery 条件
  103. * @param clazz 对象
  104. * @return List
  105. * @throws IOException IO异常
  106. * @throws SolrServerException solr服务异常
  107. */
  108. List<T> select(String collection, SolrQuery solrQuery, Class<T> clazz) throws IOException, SolrServerException;
  109. /**
  110. * 查询
  111. *
  112. * @param collection 核心
  113. * @param solrQuery 条件
  114. * @return QueryResponse
  115. * @throws IOException IO异常
  116. * @throws SolrServerException solr服务异常
  117. */
  118. QueryResponse select(String collection, SolrQuery solrQuery) throws IOException, SolrServerException;
  119. /**
  120. * 查询(支持高亮设置)
  121. *
  122. * @param collection 核心
  123. * @param query 条件
  124. * @param field 查询列
  125. * @param key 主键字段名
  126. * @param clazz 对象
  127. * @param isHigh 是否高亮显示
  128. * @return List
  129. * @throws IOException IO异常
  130. * @throws SolrServerException solr服务异常
  131. */
  132. List<T> select(String collection, SolrQuery query, String[] field, String key, Class<T> clazz, Boolean isHigh) throws SolrServerException, IOException;
  133. /**
  134. * 查询(支持高亮显示)
  135. *
  136. * @param collection 核心
  137. * @param query 条件
  138. * @param field 查询列
  139. * @param key 主键字段名
  140. * @param clazz 对象
  141. * @param isHigh 是否高亮显示
  142. * @return Map
  143. * @throws IOException IO异常
  144. * @throws SolrServerException solr服务异常
  145. */
  146. Map<String, Object> selectMap(String collection, SolrQuery query, String[] field, String key, Class<T> clazz, Boolean isHigh) throws SolrServerException, IOException;
  147. /**
  148. * 查询
  149. *
  150. * @param collection 核心
  151. * @param keyword 条件
  152. * @param ids 准备加入的条件
  153. * @param conditionKey 准备加入的条件字段名
  154. * @param current 开始下标
  155. * @param size 索引行数
  156. * @param field 高亮字段
  157. * @param key 主键
  158. * @param clazz 对象
  159. * @param isHigh 是否高亮
  160. * @param isAutoPermission 是否权限过滤
  161. * @return List
  162. * @throws IOException IO异常
  163. * @throws SolrServerException solr服务异常
  164. */
  165. List<T> select(String collection, String keyword, List<String> ids, String conditionKey, Integer current, Integer size, String[] field, String key, Class<T> clazz, Boolean isHigh, Boolean isAutoPermission) throws SolrServerException, IOException;
  166. /**
  167. * 查询
  168. *
  169. * @param collection 核心
  170. * @param keyword 条件
  171. * @param fq 过滤条件
  172. * @param ids 准备加入的条件
  173. * @param conditionKey 准备加入的条件字段名
  174. * @param current 开始下标
  175. * @param size 索引行数
  176. * @param field 高亮字段
  177. * @param key 主键
  178. * @param clazz 对象
  179. * @param isHigh 是否高亮
  180. * @param isAutoPermission 是否权限过滤
  181. * @return List
  182. * @throws IOException IO异常
  183. * @throws SolrServerException solr服务异常
  184. */
  185. List<T> select(String collection, String keyword, String fq, List<String> ids, String conditionKey, Integer current, Integer size, String[] field, String key, Class<T> clazz, Boolean isHigh, Boolean isAutoPermission) throws SolrServerException, IOException;
  186. /**
  187. * 查询
  188. *
  189. * @param collection 核心
  190. * @param keyword 条件
  191. * @param ids 准备加入的条件
  192. * @param conditionKey 准备加入的条件字段名
  193. * @param current 开始下标
  194. * @param size 索引行数
  195. * @param field 高亮字段
  196. * @param key 主键
  197. * @param clazz 对象
  198. * @param isHigh 是否高亮显示
  199. * @param isAutoPermission 是否权限过滤
  200. * @param sort 排序
  201. * @param queryEnum 权限配置方式
  202. * @return Map
  203. * @throws IOException IO异常
  204. * @throws SolrServerException solr服务异常
  205. */
  206. Map<String, Object> selectMap(String collection, String keyword, List<String> ids, String conditionKey,
  207. Integer current, Integer size, String[] field, String key, Class<T> clazz,
  208. Boolean isHigh, Boolean isAutoPermission, String sort, SolrQueryEnum queryEnum) throws SolrServerException, IOException;
  209. /**
  210. * 查询
  211. *
  212. * @param collection 核心
  213. * @param keyword 条件
  214. * @param fq 过滤条件
  215. * @param ids 准备加入的条件
  216. * @param conditionKey 准备加入的条件字段名
  217. * @param current 开始下标
  218. * @param size 索引行数
  219. * @param field 高亮字段
  220. * @param key 主键
  221. * @param clazz 对象
  222. * @param isHigh 是否高亮显示
  223. * @param isAutoPermission 是否权限过滤
  224. * @param sort 排序
  225. * @param queryEnum 权限配置方式
  226. * @return Map
  227. * @throws IOException IO异常
  228. * @throws SolrServerException solr服务异常
  229. */
  230. Map<String, Object> selectMap(String collection, String keyword, String fq, List<String> ids, String conditionKey,
  231. Integer current, Integer size, String[] field, String key, Class<T> clazz,
  232. Boolean isHigh, Boolean isAutoPermission, String sort, SolrQueryEnum queryEnum) throws SolrServerException, IOException;
  233. /**
  234. * 生成条件
  235. *
  236. * @param keyword 条件
  237. * @param ids 多值条件
  238. * @param conditionKey 拼接的条件key
  239. * @param current 分页参数
  240. * @param size 分页参数
  241. * @param field 高亮字段
  242. * @param isAutoPermission 是否附带权限
  243. * @param sort 排序
  244. * @param queryEnum 权限配置方式
  245. * @param isHigh 是否高亮
  246. * @return SolrQuery
  247. */
  248. SolrQuery getQuery(String keyword, List<String> ids, String conditionKey, Integer current, Integer size,
  249. String[] field, Boolean isAutoPermission, String sort, SolrQueryEnum queryEnum, Boolean isHigh);
  250. /**
  251. * 生成条件
  252. *
  253. * @param keyword 条件
  254. * @param fq 过滤条件
  255. * @param ids 多值条件
  256. * @param conditionKey 拼接的条件key
  257. * @param current 分页参数
  258. * @param size 分页参数
  259. * @param field 高亮字段
  260. * @param isAutoPermission 是否附带权限
  261. * @param sort 排序
  262. * @param queryEnum 权限配置方式
  263. * @param isHigh 是否高亮
  264. * @return SolrQuery
  265. */
  266. SolrQuery getQuery(String keyword, String fq, List<String> ids, String conditionKey, Integer current, Integer size,
  267. String[] field, Boolean isAutoPermission, String sort, SolrQueryEnum queryEnum, Boolean isHigh);
  268. /**
  269. * 日志输出
  270. *
  271. * @param solrQuery 条件
  272. */
  273. void printQuery(SolrQuery solrQuery);
  274. /**
  275. * 增加权限
  276. *
  277. * @param keyword 条件
  278. * @param queryEnum 权限配置方式
  279. * @return String
  280. */
  281. String addPermission(String keyword, SolrQueryEnum queryEnum);
  282. }

5.2 solr service实现类

  1. package com.datago.microservice.kb.server.service.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import cn.hutool.json.JSONUtil;
  4. import com.datago.microservice.kb.common.utils.Func;
  5. import com.datago.microservice.kb.server.enums.ParamEnum;
  6. import com.datago.microservice.kb.server.enums.SolrQueryEnum;
  7. import com.datago.microservice.kb.server.service.BaseSolrService;
  8. import com.datago.microservice.kb.server.utils.cache.ParamCache;
  9. import com.datago.microservice.kb.server.utils.common.SolrUtil;
  10. import com.datago.microservice.kb.server.utils.common.TokenUtil;
  11. import com.datago.microservice.kb.server.vo.SysUserVO;
  12. import org.apache.solr.client.solrj.SolrClient;
  13. import org.apache.solr.client.solrj.SolrQuery;
  14. import org.apache.solr.client.solrj.SolrRequest;
  15. import org.apache.solr.client.solrj.SolrServerException;
  16. import org.apache.solr.client.solrj.response.QueryResponse;
  17. import org.apache.solr.common.SolrDocumentList;
  18. import org.apache.solr.common.SolrInputDocument;
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Service;
  23. import java.io.IOException;
  24. import java.util.HashMap;
  25. import java.util.List;
  26. import java.util.Map;
  27. /**
  28. * @author xq
  29. * @date 2022/02/16 14:57
  30. * @describe
  31. */
  32. @Service
  33. public class BaseSolrServiceImpl<T> implements BaseSolrService<T> {
  34. private static final Logger log = LoggerFactory.getLogger(BaseSolrService.class);
  35. /**
  36. * solr服务
  37. */
  38. protected SolrClient solrClient;
  39. @Autowired
  40. public void setSolrClient(SolrClient solrClient) {
  41. this.solrClient = solrClient;
  42. }
  43. @Override
  44. public void insert(SolrInputDocument document) throws IOException, SolrServerException {
  45. solrClient.add(document);
  46. // 提交
  47. solrClient.commit(true, true);
  48. }
  49. @Override
  50. public void insert(String core, SolrInputDocument document) throws IOException, SolrServerException {
  51. solrClient.add(core, document);
  52. // 提交
  53. solrClient.commit(core, true, true);
  54. }
  55. @Override
  56. public void insertBatch(String core, List<SolrInputDocument> document) throws IOException, SolrServerException {
  57. solrClient.add(core, document);
  58. // 提交
  59. solrClient.commit(core, true, true);
  60. }
  61. @Override
  62. public void insertBean(String core, T t) throws IOException, SolrServerException {
  63. solrClient.addBean(core, t);
  64. // 提交
  65. solrClient.commit(core, true, true);
  66. }
  67. @Override
  68. public void update(T t) throws IOException, SolrServerException {
  69. solrClient.addBean(t);
  70. // 提交
  71. solrClient.commit(true, true);
  72. }
  73. @Override
  74. public void delete(String query) throws IOException, SolrServerException {
  75. solrClient.deleteByQuery(query);
  76. // 提交
  77. solrClient.commit(true, true);
  78. }
  79. @Override
  80. public void delete(String core, String query) throws IOException, SolrServerException {
  81. solrClient.deleteByQuery(core, query);
  82. // 提交
  83. solrClient.commit(core, true, true);
  84. }
  85. @Override
  86. public void delete(String core, List<String> query) throws IOException, SolrServerException {
  87. solrClient.deleteById(core, query);
  88. solrClient.commit(core, true, true);
  89. }
  90. @Override
  91. public List<T> select(String collection, SolrQuery solrQuery, Class<T> clazz) throws IOException, SolrServerException {
  92. // 查询
  93. QueryResponse queryResponse = solrClient.query(collection, solrQuery, SolrRequest.METHOD.POST);
  94. // 将查询结果转换指定元素类型的集合
  95. return queryResponse.getBeans(clazz);
  96. }
  97. @Override
  98. public QueryResponse select(String collection, SolrQuery solrQuery) throws IOException, SolrServerException {
  99. return solrClient.query(collection, solrQuery,SolrRequest.METHOD.POST);
  100. }
  101. @Override
  102. public List<T> select(String collection, SolrQuery query, String[] field, String key, Class<T> clazz, Boolean isHigh) throws SolrServerException, IOException {
  103. QueryResponse response = select(collection, query);
  104. // 获得高亮的结果
  105. Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
  106. List<T> list = response.getBeans(clazz);
  107. // 设置高亮内容
  108. SolrUtil.setHlContent(list, field, key, highlighting, isHigh);
  109. return list;
  110. }
  111. @Override
  112. public Map<String, Object> selectMap(String collection, SolrQuery query, String[] field, String key, Class<T> clazz, Boolean isHigh) throws SolrServerException, IOException {
  113. QueryResponse response = select(collection, query);
  114. // 获得高亮的结果
  115. Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
  116. Map<String, Object> map = new HashMap<>(8);
  117. // 设置高亮内容
  118. List<T> list = response.getBeans(clazz);
  119. SolrDocumentList results = response.getResults();
  120. SolrUtil.setHlContent(list, field, key, highlighting, isHigh);
  121. // 设置分页属性
  122. map.put(ROWS, query.getRows());
  123. map.put(START, results.getStart());
  124. map.put(NUMBER_FOUND, results.getNumFound());
  125. map.put(DOCS, list);
  126. return map;
  127. }
  128. @Override
  129. public List<T> select(String collection, String keyword, List<String> ids, String conditionKey, Integer current, Integer size,
  130. String[] field, String key, Class<T> clazz, Boolean isHigh, Boolean isAutoPermission) throws SolrServerException, IOException {
  131. return select(collection, keyword, null, ids, conditionKey, current, size, field, key, clazz, isHigh, isAutoPermission);
  132. }
  133. @Override
  134. public List<T> select(String collection, String keyword, String fq, List<String> ids, String conditionKey, Integer current, Integer size, String[] field, String key, Class<T> clazz, Boolean isHigh, Boolean isAutoPermission) throws SolrServerException, IOException {
  135. // 组织条件
  136. SolrQuery query = getQuery(keyword, fq, ids, conditionKey, current, size, field, isAutoPermission, null, SolrQueryEnum.QUERY, isHigh);
  137. return select(collection, query, field, key, clazz, isHigh);
  138. }
  139. @Override
  140. public Map<String, Object> selectMap(String collection, String keyword, List<String> ids, String conditionKey,
  141. Integer current, Integer size, String[] field, String key, Class<T> clazz,
  142. Boolean isHigh, Boolean isAutoPermission, String sort, SolrQueryEnum queryEnum) throws SolrServerException, IOException {
  143. return selectMap(collection, keyword, null, ids, conditionKey, current, size, field, key, clazz, isHigh, isAutoPermission, sort, queryEnum);
  144. }
  145. @Override
  146. public Map<String, Object> selectMap(String collection, String keyword, String fq, List<String> ids, String conditionKey, Integer current, Integer size, String[] field, String key, Class<T> clazz, Boolean isHigh, Boolean isAutoPermission, String sort, SolrQueryEnum queryEnum) throws SolrServerException, IOException {
  147. // 组织条件
  148. SolrQuery query = getQuery(keyword, fq, ids, conditionKey, current, size, field, isAutoPermission, sort, queryEnum, isHigh);
  149. return selectMap(collection, query, field, key, clazz, isHigh);
  150. }
  151. /**
  152. * 生成条件
  153. *
  154. * @param keyword 条件
  155. * @param ids 多值条件
  156. * @param conditionKey 拼接的条件key
  157. * @param current 分页参数
  158. * @param size 分页参数
  159. * @param field 高亮字段
  160. * @param isAutoPermission 是否附带权限
  161. * @return SolrQuery
  162. */
  163. @Override
  164. public SolrQuery getQuery(String keyword, List<String> ids, String conditionKey, Integer current, Integer size,
  165. String[] field, Boolean isAutoPermission, String sort, SolrQueryEnum queryEnum, Boolean isHigh) {
  166. return getQuery(keyword, null, ids, conditionKey, current, size, field, isAutoPermission, sort, queryEnum, isHigh);
  167. }
  168. @Override
  169. public SolrQuery getQuery(String keyword, String fq, List<String> ids, String conditionKey, Integer current, Integer size, String[] field, Boolean isAutoPermission, String sort, SolrQueryEnum queryEnum, Boolean isHigh) {
  170. SolrQuery query = new SolrQuery();
  171. if (ObjectUtil.isEmpty(size)) {
  172. size = 10;
  173. }
  174. if (ObjectUtil.isEmpty(current)) {
  175. current = 0;
  176. }
  177. // 如果高亮则代表输入了关键字
  178. if (isHigh) {
  179. keyword = SolrUtil.conditions(keyword, ids, conditionKey, OR);
  180. }
  181. // 过滤条件
  182. if (ObjectUtil.isNotEmpty(fq)) {
  183. query.setFilterQueries(fq);
  184. }
  185. // 是否增加权限控制
  186. if (isAutoPermission) {
  187. keyword = addPermission(keyword, queryEnum);
  188. }
  189. query.add("q", keyword);
  190. // 增加排序
  191. if (ObjectUtil.isNotEmpty(sort)) {
  192. List<SolrQuery.SortClause> clauses = SolrUtil.sort(sort);
  193. if (ObjectUtil.isNotEmpty(clauses)) {
  194. query.setSorts(clauses);
  195. }
  196. }
  197. // 设置高亮
  198. SolrUtil.setHl(query, field);
  199. // 设置分页
  200. query.setStart(current);
  201. query.setRows(size);
  202. printQuery(query);
  203. return query;
  204. }
  205. /**
  206. * 日志输出
  207. *
  208. * @param solrQuery 条件
  209. */
  210. @Override
  211. public void printQuery(SolrQuery solrQuery) {
  212. Map map = solrQuery.toMap(new HashMap<>(1));
  213. String jsonStr = JSONUtil.toJsonStr(map);
  214. log.info("solr查询条件:" + jsonStr);
  215. }
  216. /**
  217. * 增加权限
  218. *
  219. * @param keyword 条件
  220. * @return String
  221. */
  222. @Override
  223. public String addPermission(String keyword, SolrQueryEnum queryEnum) {
  224. SysUserVO user = TokenUtil.getUser();
  225. String value = ParamCache.getValue(ParamEnum.KNOWLEDGE_BASE_ROLE_NAME.getKey());
  226. value = ObjectUtil.isEmpty(value) ? ParamEnum.KNOWLEDGE_BASE_ROLE_NAME.getValue() : value;
  227. List<String> list = Func.toStrList(value);
  228. // 权限控制
  229. String permission = OPEN.concat(keyword).concat(CLOSE).concat(AND).concat(OPEN);
  230. // 普通人员权限
  231. String purview = "";
  232. // 管理人员权限
  233. String adminPurview = "";
  234. switch (queryEnum) {
  235. // 管理页面、回收站页面只可查看自己的数据
  236. case MANAGER:
  237. purview = permission
  238. // 创建用户可看
  239. .concat("create_user:").concat(user.getUserId())
  240. .concat(AND).concat("is_deleted:0")
  241. .concat(CLOSE);
  242. adminPurview = permission.concat("is_deleted:0").concat(CLOSE);
  243. break;
  244. case IS_DELETED:
  245. purview = permission
  246. // 创建用户可看
  247. .concat("create_user:").concat(user.getUserId())
  248. .concat(AND).concat("is_deleted:1")
  249. .concat(CLOSE);
  250. adminPurview = permission.concat("is_deleted:1").concat(CLOSE);
  251. break;
  252. // 查询页面可看 visible_range:ALL 或者 visible_range:自己部门 或者 自己创建的
  253. case QUERY:
  254. purview = permission.concat("visible_range:ALL")
  255. // 用户当前部门可看
  256. .concat(OR).concat("visible_range:*").concat(user.getOrgNo()).concat("*")
  257. // 创建用户可看
  258. .concat(OR).concat("create_user:").concat(user.getUserId())
  259. .concat(CLOSE);
  260. adminPurview = permission.concat("is_deleted:0").concat(CLOSE);
  261. break;
  262. // 收藏页面因用户收藏的数据已作为条件,故不做权限控制
  263. case COLLECT:
  264. default:
  265. purview = keyword;
  266. adminPurview = keyword;
  267. break;
  268. }
  269. // 知识库管理员权限校验
  270. if (ObjectUtil.isNotEmpty(list)) {
  271. for (String var2 : list) {
  272. if (user.getRole().contains(var2)) {
  273. return adminPurview;
  274. }
  275. }
  276. }
  277. return purview;
  278. }
  279. }