1 springboot整合solr的maven配置如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
2 在application.yml配置文件中配置solr的Host地址
spring:
data:
solr:
host: http://localhost:8081/solr/demo_core
3 准备实体类
这个实体类就是solr服务器的配置文件配置的字段。@Field注解是映射作用,Java实体类与solr索引的映射。
package com.datago.microservice.kb.server.entity;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.solr.client.solrj.beans.Field;
import java.io.Serializable;
/**
* @author xq
* @date 2022/03/22 16:33
* @describe 全文检索知识库
*/
@Data
public class Knowledge implements Serializable {
private static final long serialVersionUID = 1L;
@Field("id")
private String id;
/**
* 标题
*/
@ApiModelProperty(value = "标题")
@Field("title")
private String title;
/**
* 分类ID
*/
@ApiModelProperty(value = "分类ID")
@JsonSerialize(
using = ToStringSerializer.class
)
@Field("category_id")
private String categoryId;
/**
* 内容
*/
@ApiModelProperty(value = "内容")
@Field("content")
private String content;
/**
* 是否置顶,0-不置顶,1-置顶
*/
@ApiModelProperty(value = "是否置顶,0-不置顶,1-置顶")
@Field("is_top")
private Integer isTop;
/**
* 附件ID集合
*/
@ApiModelProperty(value = "附件ID集合")
@Field("attach_ids")
private String attachIds;
/**
* 标签IDS
*/
@ApiModelProperty(value = "标签IDS")
@Field("label_ids")
private String labelIds;
/**
* 可见范围
*/
@ApiModelProperty(value = "可见范围")
@Field("visible_range")
private String visibleRange;
/**
* 发布时间
*/
@ApiModelProperty(value = "发布时间")
@Field("release_time")
private String releaseTime;
/**
* 关联模块:(1.元数据、2.数据标准、3.数据质量、4.需求管理)
*/
@ApiModelProperty("关联模块:(1.元数据、2.数据标准、3.数据质量、4.需求管理)")
@Field("association_module")
private String associationModule;
@ApiModelProperty("创建人")
@Field("create_user")
private String createUser;
@ApiModelProperty("业务状态")
@Field("status")
private Integer status;
/**
* 类别祖籍列表
*/
@ApiModelProperty(value = "是否删除")
@Field("is_deleted")
private Integer isDeleted;
/**
* 创建人名称
*/
@ApiModelProperty(value = "创建人名称")
@Field("create_user_name")
private String createUserName;
/**
* 标签集合
*/
@ApiModelProperty(value = "标签集合")
@Field("label")
private String label;
/**
* 标签名集合
*/
@ApiModelProperty(value = "标签名集合")
@Field("label_name")
private String labelName;
/**
* 类别名称
*/
@ApiModelProperty(value = "类别名称")
@Field("category_name")
private String categoryName;
/**
* 类别祖籍列表
*/
@ApiModelProperty(value = "类别祖籍列表")
@Field("category_ancestors")
private String categoryAncestors;
/**
* 置顶时间
*/
@ApiModelProperty(value = "置顶时间")
@Field("top_time")
private String topTime;
/**
* 创建部门
*/
@ApiModelProperty(value = "创建部门")
@Field("create_dept")
private String createDept;
/**
* 创建部门名称
*/
@ApiModelProperty(value = "创建部门名称")
@Field("create_dept_name")
private String createDeptName;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
@Field("create_time")
private String createTime;
/**
* 修改时间
*/
@ApiModelProperty(value = "修改时间")
@Field("update_time")
private String updateTime;
/**
* 修改人名称
*/
@ApiModelProperty(value = "修改人名称")
@Field("update_user")
private String updateUser;
/**
* 修改人名称
*/
@ApiModelProperty(value = "修改人名称")
@Field("update_user_name")
private String updateUserName;
/**
* 关联模块:(1.元数据、2.数据标准、3.数据质量、4.需求管理)
*/
@ApiModelProperty("关联模块:(1.元数据、2.数据标准、3.数据质量、4.需求管理)")
@Field("association_module_name")
private String associationModuleName;
/**
* 是否收藏,0-未收藏,1-已收藏
*/
@ApiModelProperty(value = "是否收藏,0-未收藏,1-已收藏")
@Field("is_collect")
private Integer isCollect;
/**
* 平均分
*/
@ApiModelProperty(value = "平均分")
@Field("avg_score")
private Double avgScore;
@ApiModelProperty(value = "内容")
@Field("content_text")
private String contentText;
}
4 注入SolrClient对象
用法示例如下
/**
* solr服务
*/
protected SolrClient solrClient;
@Autowired
public void setSolrClient(SolrClient solrClient) {
this.solrClient = solrClient;
}
4.1 springboot添加solr索引库(给solr数据库添加数据)
public void addData() throws Exception{
Products products=new Products();
products.setPid("557");
products.setPname("可爱的胖");
products.setCatalogName("京东");
products.setPrice(80.90);
products.setDescription("很乖的宠物");
products.setPicture("test.jpg");
UpdateResponse updateResponse = solrClient.addBean(products);
solrClient.commit();
System.out.println("添加成功");
}
4.2 springboot修改和上述的添加一样,有就修改,没有就添加
4.3 springboot删除solr索引库
public void delData() throws Exception{
solrClient.deleteById("890");
solrClient.commit();
// solrClient.deleteByQuery("*:*");//先查询然后删除,*:* 这里查询条件是全部,因此执行之后会清空索引库
System.out.println("删除成功");
}
4.4 springboot查询solr索引库的数据
public void select() throws Exception{
SolrQuery solrQuery=new SolrQuery("*:*");//查询所有
QueryResponse query = solrClient.query(solrQuery);
long numFound = query.getResults().getNumFound();
System.out.println("总记录数:"+numFound);
List<Products> beans = query.getBeans(Products.class);
for(Products product:beans){
System.out.println(product.getPid()+" "+product.getPname()+" "+product.getDescription());
}
}
4.5 模仿京东条件筛选搜索
public void moreSelect() throws Exception{
SolrQuery solrQuery=new SolrQuery();
//q
solrQuery.set("q","prod_pname:衣服");
//fq:过滤查询
solrQuery.setFilterQueries("prod_catalog_name:京东");
// 多条件过滤
// solrQuery.setFilterQueries("prod_catalog_name:京东 or prod_catalog_name:淘宝");
//价格过滤
// solrQuery.addFilterQuery("prod_price:[10 TO *]");
//排序sort
// solrQuery.addSort("prod_price",SolrQuery.ORDER.asc);
//分页(规则和limit一样)
solrQuery.setStart(0);
solrQuery.setRows(5);
//回显(想查出来哪几个字段)
// solrQuery.setFields("prod_name","pid");
//高亮配置
solrQuery.setHighlight(true);//启动高亮
solrQuery.addHighlightField("prod_pname");//设置域名称
solrQuery.setHighlightSimplePre("<font color='red'>");
solrQuery.setHighlightSimplePost("</font>");
QueryResponse query = solrClient.query(solrQuery);
//得到高亮数据
Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();
long numFound = query.getResults().getNumFound();
System.out.println("总记录数:"+numFound);
List<Products> beans = query.getBeans(Products.class);
for(Products product:beans){
Map<String, List<String>> stringListMap = highlighting.get(product.getPid());
List<String> prod_pname = stringListMap.get("prod_pname");
String pname = prod_pname.get(0);
product.setPname(pname);//把名称重新赋值为高亮样式的名称
System.out.println(product.getPid()+" "+product.getPname()+" "+product.getCatalogName());
}
}
5 Solr工具
5.1 solr service
package com.datago.microservice.kb.server.service;
import com.datago.microservice.kb.server.enums.SolrQueryEnum;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @author xq
* @date 2022/02/16 11:24
* @describe
*/
public interface BaseSolrService<T> {
String OR = " OR ";
String AND = " AND ";
String REGEX = "%s";
String KEY = "id";
String KEY_FIELD = "id:";
String DOCS = "docs";
String RESPONSE = "response";
String START = "start";
String NUMBER_FOUND = "numberFound";
String ROWS = "rows";
String OPEN = "(";
String CLOSE = ")";
String IS_HIGH = "isHigh";
/**
* 插入
*
* @param document 数据导入
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
void insert(SolrInputDocument document) throws IOException, SolrServerException;
/**
* 插入
*
* @param core 核心
* @param document 数据导入
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
void insert(String core, SolrInputDocument document) throws IOException, SolrServerException;
/**
* 插入
*
* @param core 核心
* @param document 数据导入
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
void insertBatch(String core, List<SolrInputDocument> document) throws IOException, SolrServerException;
/**
* 插入
*
* @param core 核心
* @param t 数据实体
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
void insertBean(String core, T t) throws IOException, SolrServerException;
/**
* 修改
*
* @param t 数据实体
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
void update(T t) throws IOException, SolrServerException;
/**
* 删除
*
* @param query 条件
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
void delete(String query) throws IOException, SolrServerException;
/**
* 根据条件删除
*
* @param core 核心
* @param query 条件
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
void delete(String core, String query) throws IOException, SolrServerException;
/**
* 删除
*
* @param core 核心
* @param query 条件
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
void delete(String core, List<String> query) throws IOException, SolrServerException;
/**
* 查询(返回指定类型)
*
* @param collection 核心
* @param solrQuery 条件
* @param clazz 对象
* @return List
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
List<T> select(String collection, SolrQuery solrQuery, Class<T> clazz) throws IOException, SolrServerException;
/**
* 查询
*
* @param collection 核心
* @param solrQuery 条件
* @return QueryResponse
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
QueryResponse select(String collection, SolrQuery solrQuery) throws IOException, SolrServerException;
/**
* 查询(支持高亮设置)
*
* @param collection 核心
* @param query 条件
* @param field 查询列
* @param key 主键字段名
* @param clazz 对象
* @param isHigh 是否高亮显示
* @return List
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
List<T> select(String collection, SolrQuery query, String[] field, String key, Class<T> clazz, Boolean isHigh) throws SolrServerException, IOException;
/**
* 查询(支持高亮显示)
*
* @param collection 核心
* @param query 条件
* @param field 查询列
* @param key 主键字段名
* @param clazz 对象
* @param isHigh 是否高亮显示
* @return Map
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
Map<String, Object> selectMap(String collection, SolrQuery query, String[] field, String key, Class<T> clazz, Boolean isHigh) throws SolrServerException, IOException;
/**
* 查询
*
* @param collection 核心
* @param keyword 条件
* @param ids 准备加入的条件
* @param conditionKey 准备加入的条件字段名
* @param current 开始下标
* @param size 索引行数
* @param field 高亮字段
* @param key 主键
* @param clazz 对象
* @param isHigh 是否高亮
* @param isAutoPermission 是否权限过滤
* @return List
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
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;
/**
* 查询
*
* @param collection 核心
* @param keyword 条件
* @param fq 过滤条件
* @param ids 准备加入的条件
* @param conditionKey 准备加入的条件字段名
* @param current 开始下标
* @param size 索引行数
* @param field 高亮字段
* @param key 主键
* @param clazz 对象
* @param isHigh 是否高亮
* @param isAutoPermission 是否权限过滤
* @return List
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
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;
/**
* 查询
*
* @param collection 核心
* @param keyword 条件
* @param ids 准备加入的条件
* @param conditionKey 准备加入的条件字段名
* @param current 开始下标
* @param size 索引行数
* @param field 高亮字段
* @param key 主键
* @param clazz 对象
* @param isHigh 是否高亮显示
* @param isAutoPermission 是否权限过滤
* @param sort 排序
* @param queryEnum 权限配置方式
* @return Map
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
Map<String, Object> selectMap(String collection, String keyword, 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;
/**
* 查询
*
* @param collection 核心
* @param keyword 条件
* @param fq 过滤条件
* @param ids 准备加入的条件
* @param conditionKey 准备加入的条件字段名
* @param current 开始下标
* @param size 索引行数
* @param field 高亮字段
* @param key 主键
* @param clazz 对象
* @param isHigh 是否高亮显示
* @param isAutoPermission 是否权限过滤
* @param sort 排序
* @param queryEnum 权限配置方式
* @return Map
* @throws IOException IO异常
* @throws SolrServerException solr服务异常
*/
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;
/**
* 生成条件
*
* @param keyword 条件
* @param ids 多值条件
* @param conditionKey 拼接的条件key
* @param current 分页参数
* @param size 分页参数
* @param field 高亮字段
* @param isAutoPermission 是否附带权限
* @param sort 排序
* @param queryEnum 权限配置方式
* @param isHigh 是否高亮
* @return SolrQuery
*/
SolrQuery getQuery(String keyword, List<String> ids, String conditionKey, Integer current, Integer size,
String[] field, Boolean isAutoPermission, String sort, SolrQueryEnum queryEnum, Boolean isHigh);
/**
* 生成条件
*
* @param keyword 条件
* @param fq 过滤条件
* @param ids 多值条件
* @param conditionKey 拼接的条件key
* @param current 分页参数
* @param size 分页参数
* @param field 高亮字段
* @param isAutoPermission 是否附带权限
* @param sort 排序
* @param queryEnum 权限配置方式
* @param isHigh 是否高亮
* @return SolrQuery
*/
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);
/**
* 日志输出
*
* @param solrQuery 条件
*/
void printQuery(SolrQuery solrQuery);
/**
* 增加权限
*
* @param keyword 条件
* @param queryEnum 权限配置方式
* @return String
*/
String addPermission(String keyword, SolrQueryEnum queryEnum);
}
5.2 solr service实现类
package com.datago.microservice.kb.server.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.datago.microservice.kb.common.utils.Func;
import com.datago.microservice.kb.server.enums.ParamEnum;
import com.datago.microservice.kb.server.enums.SolrQueryEnum;
import com.datago.microservice.kb.server.service.BaseSolrService;
import com.datago.microservice.kb.server.utils.cache.ParamCache;
import com.datago.microservice.kb.server.utils.common.SolrUtil;
import com.datago.microservice.kb.server.utils.common.TokenUtil;
import com.datago.microservice.kb.server.vo.SysUserVO;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author xq
* @date 2022/02/16 14:57
* @describe
*/
@Service
public class BaseSolrServiceImpl<T> implements BaseSolrService<T> {
private static final Logger log = LoggerFactory.getLogger(BaseSolrService.class);
/**
* solr服务
*/
protected SolrClient solrClient;
@Autowired
public void setSolrClient(SolrClient solrClient) {
this.solrClient = solrClient;
}
@Override
public void insert(SolrInputDocument document) throws IOException, SolrServerException {
solrClient.add(document);
// 提交
solrClient.commit(true, true);
}
@Override
public void insert(String core, SolrInputDocument document) throws IOException, SolrServerException {
solrClient.add(core, document);
// 提交
solrClient.commit(core, true, true);
}
@Override
public void insertBatch(String core, List<SolrInputDocument> document) throws IOException, SolrServerException {
solrClient.add(core, document);
// 提交
solrClient.commit(core, true, true);
}
@Override
public void insertBean(String core, T t) throws IOException, SolrServerException {
solrClient.addBean(core, t);
// 提交
solrClient.commit(core, true, true);
}
@Override
public void update(T t) throws IOException, SolrServerException {
solrClient.addBean(t);
// 提交
solrClient.commit(true, true);
}
@Override
public void delete(String query) throws IOException, SolrServerException {
solrClient.deleteByQuery(query);
// 提交
solrClient.commit(true, true);
}
@Override
public void delete(String core, String query) throws IOException, SolrServerException {
solrClient.deleteByQuery(core, query);
// 提交
solrClient.commit(core, true, true);
}
@Override
public void delete(String core, List<String> query) throws IOException, SolrServerException {
solrClient.deleteById(core, query);
solrClient.commit(core, true, true);
}
@Override
public List<T> select(String collection, SolrQuery solrQuery, Class<T> clazz) throws IOException, SolrServerException {
// 查询
QueryResponse queryResponse = solrClient.query(collection, solrQuery, SolrRequest.METHOD.POST);
// 将查询结果转换指定元素类型的集合
return queryResponse.getBeans(clazz);
}
@Override
public QueryResponse select(String collection, SolrQuery solrQuery) throws IOException, SolrServerException {
return solrClient.query(collection, solrQuery,SolrRequest.METHOD.POST);
}
@Override
public List<T> select(String collection, SolrQuery query, String[] field, String key, Class<T> clazz, Boolean isHigh) throws SolrServerException, IOException {
QueryResponse response = select(collection, query);
// 获得高亮的结果
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
List<T> list = response.getBeans(clazz);
// 设置高亮内容
SolrUtil.setHlContent(list, field, key, highlighting, isHigh);
return list;
}
@Override
public Map<String, Object> selectMap(String collection, SolrQuery query, String[] field, String key, Class<T> clazz, Boolean isHigh) throws SolrServerException, IOException {
QueryResponse response = select(collection, query);
// 获得高亮的结果
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
Map<String, Object> map = new HashMap<>(8);
// 设置高亮内容
List<T> list = response.getBeans(clazz);
SolrDocumentList results = response.getResults();
SolrUtil.setHlContent(list, field, key, highlighting, isHigh);
// 设置分页属性
map.put(ROWS, query.getRows());
map.put(START, results.getStart());
map.put(NUMBER_FOUND, results.getNumFound());
map.put(DOCS, list);
return map;
}
@Override
public 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 {
return select(collection, keyword, null, ids, conditionKey, current, size, field, key, clazz, isHigh, isAutoPermission);
}
@Override
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 {
// 组织条件
SolrQuery query = getQuery(keyword, fq, ids, conditionKey, current, size, field, isAutoPermission, null, SolrQueryEnum.QUERY, isHigh);
return select(collection, query, field, key, clazz, isHigh);
}
@Override
public Map<String, Object> selectMap(String collection, String keyword, 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 {
return selectMap(collection, keyword, null, ids, conditionKey, current, size, field, key, clazz, isHigh, isAutoPermission, sort, queryEnum);
}
@Override
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 {
// 组织条件
SolrQuery query = getQuery(keyword, fq, ids, conditionKey, current, size, field, isAutoPermission, sort, queryEnum, isHigh);
return selectMap(collection, query, field, key, clazz, isHigh);
}
/**
* 生成条件
*
* @param keyword 条件
* @param ids 多值条件
* @param conditionKey 拼接的条件key
* @param current 分页参数
* @param size 分页参数
* @param field 高亮字段
* @param isAutoPermission 是否附带权限
* @return SolrQuery
*/
@Override
public SolrQuery getQuery(String keyword, List<String> ids, String conditionKey, Integer current, Integer size,
String[] field, Boolean isAutoPermission, String sort, SolrQueryEnum queryEnum, Boolean isHigh) {
return getQuery(keyword, null, ids, conditionKey, current, size, field, isAutoPermission, sort, queryEnum, isHigh);
}
@Override
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) {
SolrQuery query = new SolrQuery();
if (ObjectUtil.isEmpty(size)) {
size = 10;
}
if (ObjectUtil.isEmpty(current)) {
current = 0;
}
// 如果高亮则代表输入了关键字
if (isHigh) {
keyword = SolrUtil.conditions(keyword, ids, conditionKey, OR);
}
// 过滤条件
if (ObjectUtil.isNotEmpty(fq)) {
query.setFilterQueries(fq);
}
// 是否增加权限控制
if (isAutoPermission) {
keyword = addPermission(keyword, queryEnum);
}
query.add("q", keyword);
// 增加排序
if (ObjectUtil.isNotEmpty(sort)) {
List<SolrQuery.SortClause> clauses = SolrUtil.sort(sort);
if (ObjectUtil.isNotEmpty(clauses)) {
query.setSorts(clauses);
}
}
// 设置高亮
SolrUtil.setHl(query, field);
// 设置分页
query.setStart(current);
query.setRows(size);
printQuery(query);
return query;
}
/**
* 日志输出
*
* @param solrQuery 条件
*/
@Override
public void printQuery(SolrQuery solrQuery) {
Map map = solrQuery.toMap(new HashMap<>(1));
String jsonStr = JSONUtil.toJsonStr(map);
log.info("solr查询条件:" + jsonStr);
}
/**
* 增加权限
*
* @param keyword 条件
* @return String
*/
@Override
public String addPermission(String keyword, SolrQueryEnum queryEnum) {
SysUserVO user = TokenUtil.getUser();
String value = ParamCache.getValue(ParamEnum.KNOWLEDGE_BASE_ROLE_NAME.getKey());
value = ObjectUtil.isEmpty(value) ? ParamEnum.KNOWLEDGE_BASE_ROLE_NAME.getValue() : value;
List<String> list = Func.toStrList(value);
// 权限控制
String permission = OPEN.concat(keyword).concat(CLOSE).concat(AND).concat(OPEN);
// 普通人员权限
String purview = "";
// 管理人员权限
String adminPurview = "";
switch (queryEnum) {
// 管理页面、回收站页面只可查看自己的数据
case MANAGER:
purview = permission
// 创建用户可看
.concat("create_user:").concat(user.getUserId())
.concat(AND).concat("is_deleted:0")
.concat(CLOSE);
adminPurview = permission.concat("is_deleted:0").concat(CLOSE);
break;
case IS_DELETED:
purview = permission
// 创建用户可看
.concat("create_user:").concat(user.getUserId())
.concat(AND).concat("is_deleted:1")
.concat(CLOSE);
adminPurview = permission.concat("is_deleted:1").concat(CLOSE);
break;
// 查询页面可看 visible_range:ALL 或者 visible_range:自己部门 或者 自己创建的
case QUERY:
purview = permission.concat("visible_range:ALL")
// 用户当前部门可看
.concat(OR).concat("visible_range:*").concat(user.getOrgNo()).concat("*")
// 创建用户可看
.concat(OR).concat("create_user:").concat(user.getUserId())
.concat(CLOSE);
adminPurview = permission.concat("is_deleted:0").concat(CLOSE);
break;
// 收藏页面因用户收藏的数据已作为条件,故不做权限控制
case COLLECT:
default:
purview = keyword;
adminPurview = keyword;
break;
}
// 知识库管理员权限校验
if (ObjectUtil.isNotEmpty(list)) {
for (String var2 : list) {
if (user.getRole().contains(var2)) {
return adminPurview;
}
}
}
return purview;
}
}