提交 5ad06d27 作者: ChenShiQiang

commit temp

上级 862304bd
package com.zzsn.knowbase.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* redisConfig
*
* @author ShiQiangChen
* @date 2024/1/8
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, ?> getRedisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, ?> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setEnableTransactionSupport(true);
template.setConnectionFactory(factory);
return template;
}
}
\ No newline at end of file
......@@ -26,18 +26,18 @@ import java.util.Map;
public class KnowInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求处理之前进行调用(Controller方法调用之前)
// 返回true才会继续执行后续的Interceptor和Controller
// 返回false则取消当前请求
String token = request.getHeader("X-Access-Token");
KbAuthorizedUserService userService = SpringContextUtils.getBean(KbAuthorizedUserService.class);
Result<?> result = userService.doCheck(token);
/**第三方用户验证未通过,直接拦截请求并返回提示*/
if (!result.isSuccess()){
doRes(request,response);
return false;
}
// // 在请求处理之前进行调用(Controller方法调用之前)
// // 返回true才会继续执行后续的Interceptor和Controller
// // 返回false则取消当前请求
// String token = request.getHeader("X-Access-Token");
//
// KbAuthorizedUserService userService = SpringContextUtils.getBean(KbAuthorizedUserService.class);
// Result<?> result = userService.doCheck(token);
// /**第三方用户验证未通过,直接拦截请求并返回提示*/
// if (!result.isSuccess()){
// doRes(request,response);
// return false;
// }
return true;
}
......
......@@ -35,8 +35,8 @@ public class KnowledgeController {
@Autowired
private IKnowledgeService knowledgeService;
@Value("${python.IntelligentQaUrl:}")
private String IntelligentQaUrl;
@Value("${python.intelligentQaUrl:}")
private String intelligentQaUrl;
/**
* 分页列表查询
......@@ -51,6 +51,20 @@ public class KnowledgeController {
return Result.OK(pageList);
}
/**
* 分页列表查询
*/
@GetMapping(value = "/listFromPython")
public Result<?> listFromPython(KnowledgeParam knowledgeParam,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
@RequestParam(name = "column", defaultValue = "common") String column,
@RequestParam(name = "order", defaultValue = "desc") String order) {
IPage<KnowledgeVO> pageList = knowledgeService.listFromPython(knowledgeParam, pageNo, pageSize, column, order);
return Result.OK(pageList);
}
/**
* 添加
*
......@@ -108,7 +122,7 @@ public class KnowledgeController {
JSONObject params = new JSONObject();
params.put("question",intelligentQaParam.getQuestion());
params.put("knowledge_base_id",Arrays.asList(intelligentQaParam.getKnowledgeProjectIds().split(",")));
String result = HttpUtil.doPost(IntelligentQaUrl, params, 120000);
String result = HttpUtil.doPost(intelligentQaUrl, params, 120000);
if(!result.isEmpty()){
JSONObject jsonObject= JSON.parseObject(result);
return Result.OK(jsonObject.get("result"));
......
......@@ -78,6 +78,7 @@ public class Knowledge implements Serializable {
* 发布时间
*/
private String publishDate;
private String verifyTime;
/**
* 审核状态
*/
......
......@@ -41,4 +41,6 @@ public interface IKnowledgeService {
* @return
*/
IPage<KnowledgeVO> queryPageList(KnowledgeParam knowledgeParam, Integer pageNo, Integer pageSize, String column, String order);
IPage<KnowledgeVO> listFromPython(KnowledgeParam knowledgeParam, Integer pageNo, Integer pageSize, String column, String order);
}
package com.zzsn.knowbase.service.impl;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zzsn.knowbase.constant.Constants;
......@@ -28,7 +30,9 @@ import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import springfox.documentation.spring.web.json.Json;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
......@@ -38,6 +42,8 @@ import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import static org.apache.commons.lang3.StringUtils.split;
/**
* @Description: 知识
* @Author: chenshiqiang
......@@ -53,6 +59,11 @@ class KnowledgeServiceImpl implements IKnowledgeService {
private CodeGenerateUtil codeGenerateUtil;
@Autowired
private ProduceInfo produceInfo;
@Value("${python.searchUrl:}")
private String searchUrl;
@Autowired
private RedisUtil redisUtil;
@Override
public void addKnowledge(HttpServletRequest httpServletRequest, Knowledge knowledge) {
......@@ -186,7 +197,7 @@ class KnowledgeServiceImpl implements IKnowledgeService {
} else {
multiMatchQueryBuilder.field("title", 60);
BoolQueryBuilder nestedBoolQueryBuilder = QueryBuilders.boolQuery();
multiMatchQueryBuilder.field("contents.content",20);
multiMatchQueryBuilder.field("contents.content", 20);
nestedBoolQueryBuilder.must(multiMatchQueryBuilder);
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("contents", nestedBoolQueryBuilder, ScoreMode.None);
boolQuery.must(nestedQueryBuilder);
......@@ -203,7 +214,7 @@ class KnowledgeServiceImpl implements IKnowledgeService {
} else {
multiMatchQueryBuilder.field("title", 3);
BoolQueryBuilder nestedBoolQueryBuilder = QueryBuilders.boolQuery();
multiMatchQueryBuilder.field("contents.content",1);
multiMatchQueryBuilder.field("contents.content", 1);
nestedBoolQueryBuilder.must(multiMatchQueryBuilder);
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("contents", nestedBoolQueryBuilder, ScoreMode.None);
boolQuery.must(nestedQueryBuilder);
......@@ -257,4 +268,78 @@ class KnowledgeServiceImpl implements IKnowledgeService {
return pageData;
}
@Override
public IPage<KnowledgeVO> listFromPython(KnowledgeParam knowledgeParam, Integer pageNo, Integer pageSize, String column, String order) {
Object data = redisUtil.get(genKey(knowledgeParam));
// if (org.springframework.util.StringUtils.isEmpty(data)) {
if (true) {
JSONObject params = new JSONObject();
params.put("type", null == knowledgeParam.getTypes() ? null : Arrays.asList(knowledgeParam.getTypes().split(",")));
params.put("startTime", knowledgeParam.getStartTime());
params.put("endTime", knowledgeParam.getEndTime());
params.put("author", knowledgeParam.getAuthor());
params.put("origin", knowledgeParam.getOrigin());
params.put("verifierName", knowledgeParam.getVerifierName());
params.put("verifyStatus", knowledgeParam.getVerifyStatus());
params.put("verifyStartTime", knowledgeParam.getVerifyStartTime());
params.put("knowledge_base_id", knowledgeParam.getKnowledgeProjectId());
params.put("verifyEndTime", knowledgeParam.getVerifyEndTime());
params.put("score_threshold", 600);//score
params.put("vector_search_top_k", 100);//number
if (knowledgeParam.getSearchScope().equals(2)) {
params.put("question", knowledgeParam.getSearchInfo());
}
String result = null;
try {
result = HttpUtil.doPost(searchUrl, params, 120000);
} catch (IOException e) {
e.printStackTrace();
}
if (result == null||!result.contains("results")) {
return null;
}
JSONObject jsonObject = JSONObject.parseObject(result);
data=jsonObject.get("results");
redisUtil.set(genKey(knowledgeParam), data,100000000);
}
JSONArray jsonArray = JSONObject.parseArray(data.toString());
List<Knowledge> knowledgeList=new ArrayList<>(jsonArray.size());
for (Object o : jsonArray) {
JSONObject one = JSONObject.parseObject(o.toString());
knowledgeList.add(Knowledge.builder()
.id((String) one.get("id"))
.build());
}
return null;
}
private String genKey(KnowledgeParam knowledgeParam) {
String type = (knowledgeParam.getTypes() == null ? "" : knowledgeParam.getTypes());
String knowledgeProjectId = (knowledgeParam.getKnowledgeProjectId() == null ? "" : knowledgeParam.getKnowledgeProjectId());
String startTime = (knowledgeParam.getStartTime() == null ? "" : knowledgeParam.getStartTime());
String endTime = (knowledgeParam.getEndTime() == null ? "" : knowledgeParam.getEndTime());
String author = (knowledgeParam.getAuthor() == null ? "" : knowledgeParam.getAuthor());
String origin = (knowledgeParam.getOrigin() == null ? "" : knowledgeParam.getOrigin());
String verifierName = (knowledgeParam.getVerifierName() == null ? "" : knowledgeParam.getVerifierName());
String verifyStatus = (knowledgeParam.getVerifyStatus() == null ? "" : String.valueOf(knowledgeParam.getVerifyStatus()));
String verifyStartTime = (knowledgeParam.getVerifyStartTime() == null ? "" : knowledgeParam.getVerifyStartTime());
String verifyEndTime = (knowledgeParam.getVerifyEndTime() == null ? "" : knowledgeParam.getVerifyEndTime());
String searchInfo = (knowledgeParam.getSearchInfo() == null ? "" : knowledgeParam.getSearchInfo());
return type + "#" +
knowledgeProjectId + "#" +
startTime + "#" +
endTime + "#" +
author + "#" +
origin + "#" +
verifierName + "#" +
verifyStatus + "#" +
verifyStartTime + "#" +
verifyEndTime + "#" +
searchInfo + "#";
}
}
package com.zzsn.knowbase.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* redis 工具类
*/
@Component
public class RedisUtil {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 指定缓存失效时间
*
* @param key 键
* @param time 时间(秒)
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据key 获取过期时间
*
* @param key 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* 判断key是否存在
*
* @param key 键
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除缓存
*
* @param key 可以传一个值 或多个
*/
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
// ============================String=============================
/**
* 普通缓存获取
*
* @param key 键
* @return 值
*/
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 普通缓存放入
*
* @param key 键
* @param value 值
* @return true成功 false失败
*/
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入并设置时间
*
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 递增
*
* @param key 键
* @param delta 要增加几(大于0)
*/
public long incr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
/**
* 递减
*
* @param key 键
* @param delta 要减少几(小于0)
*/
public long decr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
// ================================Map=================================
/**
* HashGet
*
* @param key 键 不能为null
* @param item 项 不能为null
* @return 值
*/
public Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
/**
* 获取hashKey对应的所有键值
*
* @param key 键
* @return 对应的多个键值
*/
public Map<Object, Object> hmget(String key) {
return redisTemplate.opsForHash().entries(key);
}
/**
* HashSet
*
* @param key 键
* @param map 对应多个键值
* @return true 成功 false 失败
*/
public boolean hmset(String key, Map<String, Object> map) {
try {
redisTemplate.opsForHash().putAll(key, map);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* HashSet 并设置时间
*
* @param key 键
* @param map 对应多个键值
* @param time 时间(秒)
* @return true成功 false失败
*/
public boolean hmset(String key, Map<String, Object> map, long time) {
try {
redisTemplate.opsForHash().putAll(key, map);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
*
* @param key 键
* @param item 项
* @param value 值
* @return true 成功 false失败
*/
public boolean hset(String key, String item, Object value) {
try {
redisTemplate.opsForHash().put(key, item, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
*
* @param key 键
* @param item 项
* @param value 值
* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
* @return true 成功 false失败
*/
public boolean hset(String key, String item, Object value, long time) {
try {
redisTemplate.opsForHash().put(key, item, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除hash表中的值
*
* @param key 键 不能为null
* @param item 项 可以使多个 不能为null
*/
public void hdel(String key, Object... item) {
redisTemplate.opsForHash().delete(key, item);
}
/**
* 判断hash表中是否有该项的值
*
* @param key 键 不能为null
* @param item 项 不能为null
* @return true 存在 false不存在
*/
public boolean hHasKey(String key, String item) {
return redisTemplate.opsForHash().hasKey(key, item);
}
/**
* hash递增 如果不存在,就会创建一个 并把新增后的值返回
*
* @param key 键
* @param item 项
* @param by 要增加几(大于0)
*/
public void hincr(String key, String item, double by) {
redisTemplate.opsForHash().increment(key, item, by);
}
/**
* hash递减
*
* @param key 键
* @param item 项
* @param by 要减少记(小于0)
*/
public double hdecr(String key, String item, double by) {
return redisTemplate.opsForHash().increment(key, item, -by);
}
// ============================set=============================
/**
* 根据key获取Set中的所有值
*
* @param key 键
*/
public Set<Object> sGet(String key) {
try {
return redisTemplate.opsForSet().members(key);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根据value从一个set中查询,是否存在
*
* @param key 键
* @param value 值
* @return true 存在 false不存在
*/
public boolean sHasKey(String key, Object value) {
try {
return redisTemplate.opsForSet().isMember(key, value);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将数据放入set缓存
*
* @param key 键
* @param values 值 可以是多个
* @return 成功个数
*/
public long sSet(String key, Object... values) {
try {
return redisTemplate.opsForSet().add(key, values);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 将set数据放入缓存
*
* @param key 键
* @param time 时间(秒)
* @param values 值 可以是多个
* @return 成功个数
*/
public long sSetAndTime(String key, long time, Object... values) {
try {
long count = redisTemplate.opsForSet().add(key, values);
if (time > 0) {
expire(key, time);
}
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 获取set缓存的长度
*
* @param key 键
*/
public long sGetSetSize(String key) {
try {
return redisTemplate.opsForSet().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 移除值为value的
*
* @param key 键
* @param values 值 可以是多个
* @return 移除的个数
*/
public long setRemove(String key, Object... values) {
try {
return redisTemplate.opsForSet().remove(key, values);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
// ===============================list=================================
/**
* 获取list缓存的内容
*
* @param key 键
* @param start 开始
* @param end 结束 0 到 -1代表所有值
*/
public List<Object> lGet(String key, long start, long end) {
try {
return redisTemplate.opsForList().range(key, start, end);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 获取list缓存的长度
*
* @param key 键
*/
public long lGetListSize(String key) {
try {
return redisTemplate.opsForList().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 通过索引 获取list中的值
*
* @param key 键
* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
*/
public Object lGetIndex(String key, long index) {
try {
return redisTemplate.opsForList().index(key, index);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
*/
public boolean lSet(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @param time 时间(秒)
*/
public boolean lSet(String key, Object value, long time) {
try {
redisTemplate.opsForList().rightPush(key, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
*/
public boolean lSet(String key, List<Object> value) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @param time 时间(秒)
*/
public boolean lSet(String key, List<Object> value, long time) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据索引修改list中的某条数据
*
* @param key 键
* @param index 索引
* @param value 值
*/
public boolean lUpdateIndex(String key, long index, Object value) {
try {
redisTemplate.opsForList().set(key, index, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 移除N个值为value
*
* @param key 键
* @param count 移除多少个
* @param value 值
* @return 移除的个数
*/
public long lRemove(String key, long count, Object value) {
try {
return redisTemplate.opsForList().remove(key, count, value);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 获取指定前缀的一系列key
* 使用scan命令代替keys, Redis是单线程处理,keys命令在KEY数量较多时,
* 操作效率极低【时间复杂度为O(N)】,该命令一旦执行会严重阻塞线上其它命令的正常请求
* @param keyPrefix key统一的前缀
*/
private Set<String> keys(String keyPrefix) {
String realKey = keyPrefix + "*";
try {
return redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
Set<String> binaryKeys = new HashSet<>();
Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(realKey).count(Integer.MAX_VALUE).build());
while (cursor.hasNext()) {
binaryKeys.add(new String(cursor.next()));
}
return binaryKeys;
});
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
/**
* 删除指定前缀的一系列key
* @param keyPrefix key统一的前缀
*/
public void removeAll(String keyPrefix) {
try {
Set<String> keys = keys(keyPrefix);
if (!CollectionUtils.isEmpty(keys)) {
redisTemplate.delete(keys);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
......@@ -24,7 +24,7 @@ public class KnowledgeParam {
/**
* 作者
*/
private Integer author;
private String author;
/**
* 发布时间
*/
......@@ -48,12 +48,14 @@ public class KnowledgeParam {
/**
* 类型
*/
private String type;
private String types;
private String startTime;
private String endTime;
private String searchInfo;
private Integer searchScope;
private String searchAccuracy;
private String verifyStartTime;
private String verifyEndTime;
}
......@@ -18,8 +18,6 @@ spring:
brokers: 114.115.159.144:9092
zkNodes: 114.115.159.144:2181
requiredAcks: 1
redis:
database: 0
host: 114.115.236.206
......@@ -39,7 +37,8 @@ mybatis-plus:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
python:
IntelligentQaUrl: http://116.63.179.212:7862/platform/chat
intelligentQaUrl: http://116.63.179.212:7862/platform/chat
searchUrl: http://114.115.172.99:10013/platform/search
know:
thirdpartyurl:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论