Commit 34768f15 by 陈健智

ai搜索品牌、关键词提取优化,接口耗费记录补充

parent 02803bf0
...@@ -144,7 +144,7 @@ public class AopLogRecord { ...@@ -144,7 +144,7 @@ public class AopLogRecord {
String[] value = method.getAnnotation(LogRecord.class).values(); String[] value = method.getAnnotation(LogRecord.class).values();
// 注解value为空字符串(value使用默认值未设置) // 注解value为空字符串(value使用默认值未设置)
if (1 == value.length && StringUtils.isEmpty(value[0])){ if (1 == value.length && StringUtils.isEmpty(value[0])){
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix, userInfo.getRoleId(), now, now); return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix, userInfo.getRoleId(), now, now, null);
} }
// 获取接口传参(value为获取传参的具体字段)并与操作描述description拼接返回,传参值为实体 // 获取接口传参(value为获取传参的具体字段)并与操作描述description拼接返回,传参值为实体
if (method.getAnnotation(LogRecord.class).arguments() && method.getAnnotation(LogRecord.class).entity()) { if (method.getAnnotation(LogRecord.class).arguments() && method.getAnnotation(LogRecord.class).entity()) {
...@@ -176,7 +176,7 @@ public class AopLogRecord { ...@@ -176,7 +176,7 @@ public class AopLogRecord {
} }
} }
String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concatWithMinus(res) : ""; String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concatWithMinus(res) : "";
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now); return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now, null);
} }
// 获取接口传参(value为获取传参的具体字段)并与操作描述description拼接返回,传参值不为实体 // 获取接口传参(value为获取传参的具体字段)并与操作描述description拼接返回,传参值不为实体
if (method.getAnnotation(LogRecord.class).arguments() && !method.getAnnotation(LogRecord.class).entity()) { if (method.getAnnotation(LogRecord.class).arguments() && !method.getAnnotation(LogRecord.class).entity()) {
...@@ -190,7 +190,7 @@ public class AopLogRecord { ...@@ -190,7 +190,7 @@ public class AopLogRecord {
} }
} }
String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concatWithMinus(res) : ""; String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concatWithMinus(res) : "";
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now); return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now, null);
} }
// 获取接口返回值(value为获取返回值的具体字段)并与操作描述description拼接返回,返回值为实体 // 获取接口返回值(value为获取返回值的具体字段)并与操作描述description拼接返回,返回值为实体
if (!method.getAnnotation(LogRecord.class).arguments() && method.getAnnotation(LogRecord.class).entity() && Objects.nonNull(responseResult)) { if (!method.getAnnotation(LogRecord.class).arguments() && method.getAnnotation(LogRecord.class).entity() && Objects.nonNull(responseResult)) {
...@@ -204,9 +204,9 @@ public class AopLogRecord { ...@@ -204,9 +204,9 @@ public class AopLogRecord {
} }
} }
String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concatWithMinus(res) : ""; String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concatWithMinus(res) : "";
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now); return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now, null);
} }
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix, userInfo.getRoleId(), now, now); return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix, userInfo.getRoleId(), now, now, null);
} }
/** /**
......
...@@ -340,11 +340,6 @@ public class EsClientDao { ...@@ -340,11 +340,6 @@ public class EsClientDao {
BoolQueryBuilder query = getBoolQueryBuilder(fieldMappings); BoolQueryBuilder query = getBoolQueryBuilder(fieldMappings);
String[] fetchSource = {"id", GenericAttribute.ES_TIME, GenericAttribute.ES_IND_TITLE}; String[] fetchSource = {"id", GenericAttribute.ES_TIME, GenericAttribute.ES_IND_TITLE};
SearchHit[] hits = searchHits(getIndexes(), query, null, fetchSource, null, 0, 10000, null).getHits(); SearchHit[] hits = searchHits(getIndexes(), query, null, fetchSource, null, 0, 10000, null).getHits();
// Map<String, JSONObject> idBaseMap = Arrays.stream(hits).map(hit -> new JSONObject(hit.getSourceAsMap())).collect(Collectors.toMap(json -> json.getString("id"), o -> o));
// Map<String, String> idTitle = Arrays.stream(hits)
// .map(hit -> new JSONObject(hit.getSourceAsMap()))
// .filter(json -> Objects.nonNull(json.getString(GenericAttribute.ES_IND_TITLE)))
// .collect(Collectors.toMap(json -> json.getString("id"), json -> json.getString(GenericAttribute.ES_IND_TITLE)));
Pair<Map<String, JSONObject>, Map<String, String>> searchProcess = findSearchResultProcess(hits); Pair<Map<String, JSONObject>, Map<String, String>> searchProcess = findSearchResultProcess(hits);
Map<String, JSONObject> idBaseMap = searchProcess.getLeft(); Map<String, JSONObject> idBaseMap = searchProcess.getLeft();
Map<String, String> idTitle = searchProcess.getRight(); Map<String, String> idTitle = searchProcess.getRight();
...@@ -378,7 +373,7 @@ public class EsClientDao { ...@@ -378,7 +373,7 @@ public class EsClientDao {
Map<String, JSONObject> idBaseMap = Arrays.stream(hits).map(hit -> new JSONObject(hit.getSourceAsMap())).collect(Collectors.toMap(json -> json.getString("id"), o -> o)); Map<String, JSONObject> idBaseMap = Arrays.stream(hits).map(hit -> new JSONObject(hit.getSourceAsMap())).collect(Collectors.toMap(json -> json.getString("id"), o -> o));
Map<String, String> idTitle = Arrays.stream(hits) Map<String, String> idTitle = Arrays.stream(hits)
.map(hit -> new JSONObject(hit.getSourceAsMap())) .map(hit -> new JSONObject(hit.getSourceAsMap()))
.filter(json -> Objects.nonNull(json.getString(GenericAttribute.ES_IND_TITLE))) .filter(json -> Objects.nonNull(json.getString(GenericAttribute.ES_IND_TITLE)) || Tools.filterUselessTitle(GenericAttribute.ES_IND_TITLE))
.collect(Collectors.toMap(json -> json.getString("id"), json -> json.getString(GenericAttribute.ES_IND_TITLE))); .collect(Collectors.toMap(json -> json.getString("id"), json -> json.getString(GenericAttribute.ES_IND_TITLE)));
return Pair.of(idBaseMap, idTitle); return Pair.of(idBaseMap, idTitle);
} }
...@@ -387,7 +382,7 @@ public class EsClientDao { ...@@ -387,7 +382,7 @@ public class EsClientDao {
fieldMappings.stream().filter(fieldMapping -> Objects.equals(FieldMapping.FieldMap.IND_FULL_TEXT, fieldMapping.getFieldMap())) fieldMappings.stream().filter(fieldMapping -> Objects.equals(FieldMapping.FieldMap.IND_FULL_TEXT, fieldMapping.getFieldMap()))
.findFirst().ifPresent(fieldMapping -> { .findFirst().ifPresent(fieldMapping -> {
String value = String.valueOf(fieldMapping.getValue()); String value = String.valueOf(fieldMapping.getValue());
String newValue = HanLP.segment(Tools.filterSpecialCharacter(value)).stream().map(s -> s.word).distinct().collect(Collectors.joining("|")); String newValue = HanLP.segment(Tools.filterSpecialCharacter(value)).stream().map(s -> s.word).distinct().collect(Collectors.joining(" "));
fieldMapping.setValue(newValue); fieldMapping.setValue(newValue);
}); });
BoolQueryBuilder query = getBoolQueryBuilder(fieldMappings); BoolQueryBuilder query = getBoolQueryBuilder(fieldMappings);
......
package com.zhiwei.brandkbs2.pojo; package com.zhiwei.brandkbs2.pojo;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
/** /**
* @ClassName: UserLogRecord * @ClassName: UserLogRecord
...@@ -14,6 +15,7 @@ import org.springframework.data.mongodb.core.mapping.Document; ...@@ -14,6 +15,7 @@ import org.springframework.data.mongodb.core.mapping.Document;
@Getter @Getter
@Setter @Setter
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor
public class UserLogRecord extends AbstractBaseMongo{ public class UserLogRecord extends AbstractBaseMongo{
/** /**
* 项目id * 项目id
...@@ -43,4 +45,21 @@ public class UserLogRecord extends AbstractBaseMongo{ ...@@ -43,4 +45,21 @@ public class UserLogRecord extends AbstractBaseMongo{
* 更新时间 * 更新时间
*/ */
private Long updateTime; private Long updateTime;
/**
* 本次调用费用(ai搜索)
*/
private Double cost;
public static UserLogRecord userLogRecordCost(String description, double cost){
UserLogRecord record = new UserLogRecord();
record.setProjectId(UserThreadLocal.getProjectId());
record.setUserId(UserThreadLocal.getUserId());
record.setNickname(UserThreadLocal.getNickname());
record.setDescription(description);
record.setRoleId(UserThreadLocal.getRoleId());
record.setCTime(System.currentTimeMillis());
record.setUpdateTime(System.currentTimeMillis());
record.setCost(cost);
return record;
}
} }
package com.zhiwei.brandkbs2.pojo.ai; package com.zhiwei.brandkbs2.pojo.ai;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.GlobalPojo;
import com.zhiwei.brandkbs2.config.Constant;
import com.zhiwei.brandkbs2.es.EsQueryTools; import com.zhiwei.brandkbs2.es.EsQueryTools;
import com.zhiwei.brandkbs2.pojo.AbstractProject;
import com.zhiwei.brandkbs2.pojo.Contend;
import com.zhiwei.brandkbs2.pojo.Project;
import lombok.Data; import lombok.Data;
import lombok.Getter; import lombok.Getter;
import org.apache.lucene.search.join.ScoreMode; import org.apache.lucene.search.join.ScoreMode;
import org.elasticsearch.index.query.*; import org.elasticsearch.index.query.*;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* @ClassName: FieldMap * @ClassName: FieldMap
...@@ -35,7 +28,7 @@ public class FieldMapping { ...@@ -35,7 +28,7 @@ public class FieldMapping {
public QueryBuilder buildQuery(FieldMapping fieldMapping) { public QueryBuilder buildQuery(FieldMapping fieldMapping) {
boolean existsAnd = null != fieldMapping; boolean existsAnd = null != fieldMapping;
RangeQueryBuilder timeRangeBuilder; RangeQueryBuilder timeRangeBuilder;
String contendId = "0"; String[] contendIds = {"0"};
// 项目组需绑定查询 // 项目组需绑定查询
switch (fieldMap) { switch (fieldMap) {
case START_TIME: case START_TIME:
...@@ -52,12 +45,17 @@ public class FieldMapping { ...@@ -52,12 +45,17 @@ public class FieldMapping {
return timeRangeBuilder; return timeRangeBuilder;
case PROJECT: case PROJECT:
if (existsAnd && fieldMapping.fieldMap == FieldMap.BRAND) { if (existsAnd && fieldMapping.fieldMap == FieldMap.BRAND) {
contendId = (String) fieldMapping.value; contendIds = ((String) fieldMapping.value).split("\\|");
} }
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
for (String contendId : contendIds) {
BoolQueryBuilder nestedBoolBuilder = QueryBuilders.boolQuery(); BoolQueryBuilder nestedBoolBuilder = QueryBuilders.boolQuery();
// 必要条件 // 必要条件
nestedBoolBuilder.must(QueryBuilders.termQuery(fieldMap.databaseName, value + "_" + contendId)); nestedBoolBuilder.must(QueryBuilders.termQuery(fieldMap.databaseName, value + "_" + contendId));
return new NestedQueryBuilder("brandkbs_cache_maps", nestedBoolBuilder, ScoreMode.None); boolQueryBuilder.should(new NestedQueryBuilder("brandkbs_cache_maps", nestedBoolBuilder, ScoreMode.None));
}
boolQueryBuilder.minimumShouldMatch(1);
return boolQueryBuilder;
case BRAND: case BRAND:
if (!existsAnd || fieldMapping.fieldMap != FieldMap.PROJECT) { if (!existsAnd || fieldMapping.fieldMap != FieldMap.PROJECT) {
throw new IllegalStateException("项目条件缺失"); throw new IllegalStateException("项目条件缺失");
...@@ -65,7 +63,6 @@ public class FieldMapping { ...@@ -65,7 +63,6 @@ public class FieldMapping {
return fieldMapping.buildQuery(this); return fieldMapping.buildQuery(this);
case IND_FULL_TEXT: case IND_FULL_TEXT:
return EsQueryTools.assembleNormalKeywordQuery(String.valueOf(value), new String[]{fieldMap.databaseName}); return EsQueryTools.assembleNormalKeywordQuery(String.valueOf(value), new String[]{fieldMap.databaseName});
// return QueryBuilders.matchPhraseQuery(fieldMap.databaseName, value);
case SOURCE: case SOURCE:
case MTAG: case MTAG:
return QueryBuilders.termQuery(fieldMap.databaseName, value); return QueryBuilders.termQuery(fieldMap.databaseName, value);
...@@ -97,41 +94,59 @@ public class FieldMapping { ...@@ -97,41 +94,59 @@ public class FieldMapping {
} }
} }
public static FieldMapping createFromNameAndValue(String name, Object value, List<FieldMapping> fieldMappings) { public static FieldMapping createFromNameAndValue(String name, Object value, String question) {
FieldMap fieldMap = null; FieldMap fieldMap = null;
// String projectId = UserThreadLocal.getProjectId();
// TODO 字段转换待完善,引入数据库 // TODO 字段转换待完善,引入数据库
for (FieldMap f : FieldMap.values()) { for (FieldMap f : FieldMap.values()) {
if (name.equals(f.getName())) { if (name.equals(f.getName())) {
// 项目名需要转成id // // 项目名需要转成id
if (FieldMap.PROJECT == f) { // if (FieldMap.PROJECT == f) {
Map<String, Project> projectMap = GlobalPojo.PROJECT_MAP.values().stream().collect(Collectors.toMap(AbstractProject::getProjectName, o -> o)); // Map<String, Project> projectMap = GlobalPojo.PROJECT_MAP.values().stream().collect(Collectors.toMap(AbstractProject::getProjectName, o -> o));
if (projectMap.containsKey(String.valueOf(value))) { // if (projectMap.containsKey(String.valueOf(value))) {
value = projectMap.get(String.valueOf(value)).getId(); // value = projectMap.get(String.valueOf(value)).getId();
}else { // }else {
value = UserThreadLocal.getProjectId(); // value = projectId;
} // }
} // }
// 品牌需要转换 // 品牌需要转换
if (FieldMap.BRAND == f) { // if (FieldMap.BRAND == f) {
if ("主品牌".equals(value)) { // Project project = GlobalPojo.PROJECT_MAP.get(projectId);
value = Constant.PRIMARY_CONTEND_ID; // if (CollectionUtils.isNotEmpty(project.getContendList())){
} else { // List<String> contends = new ArrayList<>();
// 寻找对应的竞品id // List<String> contendNames = project.getContendList().stream().map(AbstractProject::getBrandName).collect(Collectors.toList());
Optional<FieldMapping> project = fieldMappings.stream().filter(field -> Objects.equals(FieldMap.PROJECT, field.getFieldMap())).findFirst(); // for (String contendName : contendNames) {
if (project.isPresent()){ // if (question.contains(contendName)) {
List<Contend> contendList = GlobalPojo.PROJECT_MAP.get(String.valueOf(project.get().getValue())).getContendList(); // contends.add(contendName);
Object finalValue = value; // }
Optional<Contend> contendOptional = contendList.stream().filter(contend -> Objects.equals(contend.getBrandName(), finalValue)).findFirst(); // }
if (contendOptional.isPresent()){ // if (CollectionUtils.isNotEmpty(contends)){
value = contendOptional.get().getId(); // value = String.join("|", contends);
}else { // }else {
value = Constant.PRIMARY_CONTEND_ID; // value = Constant.PRIMARY_CONTEND_ID;
} // }
}else { // }else {
value = Constant.PRIMARY_CONTEND_ID; // value = Constant.PRIMARY_CONTEND_ID;
} // }
} // if ("主品牌".equals(value)) {
} // value = Constant.PRIMARY_CONTEND_ID;
// } else {
// // 寻找对应的竞品id
// Optional<FieldMapping> project = fieldMappings.stream().filter(field -> Objects.equals(FieldMap.PROJECT, field.getFieldMap())).findFirst();
// if (project.isPresent()){
// List<Contend> contendList = GlobalPojo.PROJECT_MAP.get(String.valueOf(project.get().getValue())).getContendList();
// Object finalValue = value;
// Optional<Contend> contendOptional = contendList.stream().filter(contend -> Objects.equals(contend.getBrandName(), finalValue)).findFirst();
// if (contendOptional.isPresent()){
// value = contendOptional.get().getId();
// }else {
// value = Constant.PRIMARY_CONTEND_ID;
// }
// }else {
// value = Constant.PRIMARY_CONTEND_ID;
// }
// }
// }
// 标签只包含正负中 // 标签只包含正负中
if (FieldMap.MTAG == f) { if (FieldMap.MTAG == f) {
if (!Arrays.asList("正面", "中性", "负面").contains(String.valueOf(value))) { if (!Arrays.asList("正面", "中性", "负面").contains(String.valueOf(value))) {
......
...@@ -174,7 +174,7 @@ public class BehaviorServiceImpl implements BehaviorService { ...@@ -174,7 +174,7 @@ public class BehaviorServiceImpl implements BehaviorService {
if (null == userInfo) { if (null == userInfo) {
return; return;
} }
UserLogRecord userLogRecord = new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), description, userInfo.getRoleId(), now, now); UserLogRecord userLogRecord = new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), description, userInfo.getRoleId(), now, now, null);
String collectionName = userLogRecordDao.generateCollectionName(); String collectionName = userLogRecordDao.generateCollectionName();
userLogRecordDao.insertOne(userLogRecord, collectionName); userLogRecordDao.insertOne(userLogRecord, collectionName);
} }
......
...@@ -493,7 +493,11 @@ public class TaskServiceImpl implements TaskService { ...@@ -493,7 +493,11 @@ public class TaskServiceImpl implements TaskService {
public void cacheAIQuestion() { public void cacheAIQuestion() {
AtomicInteger total = new AtomicInteger(); AtomicInteger total = new AtomicInteger();
CompletableFuture.allOf(GlobalPojo.PROJECT_MAP.values().stream().map(project -> CompletableFuture.supplyAsync(() -> { CompletableFuture.allOf(GlobalPojo.PROJECT_MAP.values().stream().map(project -> CompletableFuture.supplyAsync(() -> {
UserThreadLocal.set(new UserInfo().setProjectId(project.getId())); UserInfo userInfo = new UserInfo().setProjectId(project.getId());
userInfo.setUserId("0");
userInfo.setNickname("系统");
userInfo.setRoleId(1);
UserThreadLocal.set(userInfo);
markDataService.getAIReferenceQuestionCache(false); markDataService.getAIReferenceQuestionCache(false);
log.info("项目:{}-{}-AI参考问题缓存完成:{}个", project.getProjectName(), project.getId(), total.incrementAndGet()); log.info("项目:{}-{}-AI参考问题缓存完成:{}个", project.getProjectName(), project.getId(), total.incrementAndGet());
return null; return null;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment