[improvement][project] supersonic 0.7.0 version backend update (#24)

* [improvement][project] supersonic 0.7.0 version backend update

* [improvement][project] supersonic 0.7.0 version backend update

* [improvement][project] supersonic 0.7.0 version readme update

---------

Co-authored-by: jolunoluo <jolunoluo@tencent.com>
This commit is contained in:
SunDean
2023-08-05 22:17:56 +08:00
committed by GitHub
parent 6951eada9d
commit aa0a100a85
184 changed files with 2609 additions and 1238 deletions

View File

@@ -3,12 +3,14 @@ package com.tencent.supersonic.knowledge.dictionary.builder;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Objects;
import com.tencent.supersonic.chat.api.pojo.SchemaElement;
import com.tencent.supersonic.knowledge.dictionary.DictWord;
import com.tencent.supersonic.knowledge.dictionary.DictWordType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
/**
* dimension value wordNature
@@ -20,13 +22,23 @@ public class EntityWordBuilder extends BaseWordBuilder {
@Override
public List<DictWord> doGet(String word, SchemaElement schemaElement) {
List<DictWord> result = Lists.newArrayList();
DictWord dictWord = new DictWord();
dictWord.setWord(word);
if (Objects.isNull(schemaElement)) {
return result;
}
Long domain = schemaElement.getDomain();
String nature = DictWordType.NATURE_SPILT + domain + DictWordType.NATURE_SPILT + schemaElement.getId()
+ DictWordType.ENTITY.getType();
dictWord.setNatureWithFrequency(String.format("%s " + DEFAULT_FREQUENCY * 2, nature));
result.add(dictWord);
if (!CollectionUtils.isEmpty(schemaElement.getAlias())) {
schemaElement.getAlias().stream().forEach(alias -> {
DictWord dictWordAlias = new DictWord();
dictWordAlias.setWord(alias);
dictWordAlias.setNatureWithFrequency(String.format("%s " + DEFAULT_FREQUENCY * 2, nature));
result.add(dictWordAlias);
});
}
return result;
}

View File

@@ -4,19 +4,13 @@ import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.tencent.supersonic.chat.api.component.SemanticLayer;
import com.tencent.supersonic.chat.api.pojo.DomainSchema;
import com.tencent.supersonic.common.pojo.Aggregator;
import com.tencent.supersonic.common.pojo.Order;
import com.tencent.supersonic.common.pojo.ResultData;
import com.tencent.supersonic.semantic.api.model.response.DomainSchemaResp;
import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.ParameterizedTypeReference;
@@ -76,31 +70,5 @@ public abstract class BaseSemanticLayer implements SemanticLayer {
return domainSchemaList;
}
protected void deletionDuplicated(QueryStructReq queryStructReq) {
if (!CollectionUtils.isEmpty(queryStructReq.getGroups()) && queryStructReq.getGroups().size() > 1) {
Set<String> groups = new HashSet<>();
groups.addAll(queryStructReq.getGroups());
queryStructReq.getGroups().clear();
queryStructReq.getGroups().addAll(groups);
}
}
protected void onlyQueryFirstMetric(QueryStructReq queryStructReq) {
if (!CollectionUtils.isEmpty(queryStructReq.getAggregators()) && queryStructReq.getAggregators().size() > 1) {
log.info("multi metric in aggregators:{} , only query first one", queryStructReq.getAggregators());
List<Aggregator> aggregators = queryStructReq.getAggregators().subList(0, 1);
List<String> excludeAggregators = queryStructReq.getAggregators().stream().map(a -> a.getColumn())
.filter(a -> !a.equals(aggregators.get(0).getColumn())).collect(
Collectors.toList());
queryStructReq.setAggregators(aggregators);
List<Order> orders = queryStructReq.getOrders().stream()
.filter(o -> !excludeAggregators.contains(o.getColumn())).collect(
Collectors.toList());
log.info("multi metric in orders:{} ", queryStructReq.getOrders());
queryStructReq.setOrders(orders);
}
}
protected abstract List<DomainSchemaResp> doFetchDomainSchema(List<Long> ids);
}

View File

@@ -4,6 +4,7 @@ import com.tencent.supersonic.chat.api.pojo.DomainSchema;
import com.tencent.supersonic.chat.api.pojo.SchemaElement;
import com.tencent.supersonic.chat.api.pojo.SchemaElementType;
import com.tencent.supersonic.semantic.api.model.pojo.DimValueMap;
import com.tencent.supersonic.semantic.api.model.pojo.Entity;
import com.tencent.supersonic.semantic.api.model.response.DimSchemaResp;
import com.tencent.supersonic.semantic.api.model.response.DomainSchemaResp;
import com.tencent.supersonic.semantic.api.model.response.MetricSchemaResp;
@@ -13,6 +14,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.stream.Collectors;
public class DomainSchemaBuilder {
@@ -100,18 +102,21 @@ public class DomainSchemaBuilder {
domainSchema.getDimensions().addAll(dimensions);
domainSchema.getDimensionValues().addAll(dimensionValues);
if (!CollectionUtils.isEmpty(resp.getEntityNames())) {
Set<SchemaElement> entities = new HashSet<>();
for (String entity : resp.getEntityNames()) {
entities.add(SchemaElement.builder()
.domain(resp.getId())
.id(resp.getId())
.name(entity)
.bizName(entity)
.type(SchemaElementType.ENTITY)
.build());
Entity entity = resp.getEntity();
if (Objects.nonNull(entity)) {
SchemaElement entityElement = new SchemaElement();
if (!CollectionUtils.isEmpty(entity.getNames()) && Objects.nonNull(entity.getEntityId())) {
Map<Long, SchemaElement> idAndDimPair = dimensions.stream()
.collect(Collectors.toMap(SchemaElement::getId, schemaElement -> schemaElement,(k1,k2)->k2));
if (idAndDimPair.containsKey(entity.getEntityId())) {
entityElement = idAndDimPair.get(entity.getEntityId());
entityElement.setType(SchemaElementType.ENTITY);
}
entityElement.setAlias(entity.getNames());
domainSchema.setEntity(entityElement);
}
domainSchema.getEntities().addAll(entities);
}
return domainSchema;

View File

@@ -36,8 +36,6 @@ public class LocalSemanticLayer extends BaseSemanticLayer {
@Override
public QueryResultWithSchemaResp queryByStruct(QueryStructReq queryStructReq, User user) {
deletionDuplicated(queryStructReq);
onlyQueryFirstMetric(queryStructReq);
try {
QueryService queryService = ContextUtils.getBean(QueryService.class);
QueryResultWithSchemaResp queryResultWithSchemaResp = queryService.queryByStruct(queryStructReq, user);
@@ -50,10 +48,6 @@ public class LocalSemanticLayer extends BaseSemanticLayer {
@Override
public QueryResultWithSchemaResp queryByMultiStruct(QueryMultiStructReq queryMultiStructReq, User user) {
for (QueryStructReq queryStructReq : queryMultiStructReq.getQueryStructReqs()) {
deletionDuplicated(queryStructReq);
onlyQueryFirstMetric(queryStructReq);
}
try {
QueryService queryService = ContextUtils.getBean(QueryService.class);
return queryService.queryByMultiStruct(queryMultiStructReq, user);

View File

@@ -58,8 +58,6 @@ public class RemoteSemanticLayer extends BaseSemanticLayer {
@Override
public QueryResultWithSchemaResp queryByStruct(QueryStructReq queryStructReq, User user) {
deletionDuplicated(queryStructReq);
onlyQueryFirstMetric(queryStructReq);
DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class);
return searchByRestTemplate(
defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getSearchByStructPath(),
@@ -68,10 +66,6 @@ public class RemoteSemanticLayer extends BaseSemanticLayer {
@Override
public QueryResultWithSchemaResp queryByMultiStruct(QueryMultiStructReq queryMultiStructReq, User user) {
for (QueryStructReq queryStructReq : queryMultiStructReq.getQueryStructReqs()) {
deletionDuplicated(queryStructReq);
onlyQueryFirstMetric(queryStructReq);
}
DefaultSemanticConfig defaultSemanticConfig = ContextUtils.getBean(DefaultSemanticConfig.class);
return searchByRestTemplate(
defaultSemanticConfig.getSemanticUrl() + defaultSemanticConfig.getSearchByMultiStructPath(),