查询接口优化

This commit is contained in:
2026-01-11 23:41:42 +08:00
parent 955cfe8f99
commit 5aac18bc52
5 changed files with 131 additions and 24 deletions

View File

@@ -54,7 +54,13 @@ public class AppJobController extends BaseController
EsPageInfo<ESJobDocument> list = jobService.appList(job); EsPageInfo<ESJobDocument> list = jobService.appList(job);
return getTableDataInfo2(list,job); return getTableDataInfo2(list,job);
} }
@ApiOperation("查询岗位列表(AI专用)")
@GetMapping("/aiList")
public TableDataInfo aiList(ESJobSearch job)
{
EsPageInfo<ESJobDocument> list = jobService.aiList(job);
return getTableDataInfo2(list,job);
}
private TableDataInfo getTableDataInfo2(EsPageInfo<ESJobDocument> list, ESJobSearch job) { private TableDataInfo getTableDataInfo2(EsPageInfo<ESJobDocument> list, ESJobSearch job) {
long total = list.getTotal(); long total = list.getTotal();
TableDataInfo rspData = new TableDataInfo(); TableDataInfo rspData = new TableDataInfo();

View File

@@ -51,6 +51,7 @@ public interface IESJobSearchService
EsPageInfo<ESJobDocument> commercialArea(ESJobSearch jobQuery); EsPageInfo<ESJobDocument> commercialArea(ESJobSearch jobQuery);
EsPageInfo<ESJobDocument> appList(ESJobSearch jobQuery); EsPageInfo<ESJobDocument> appList(ESJobSearch jobQuery);
EsPageInfo<ESJobDocument> aiList(ESJobSearch jobQuery);
void checkEsAndFix(); void checkEsAndFix();

View File

@@ -67,6 +67,7 @@ public interface IJobService
EsPageInfo<ESJobDocument> appList(ESJobSearch job); EsPageInfo<ESJobDocument> appList(ESJobSearch job);
EsPageInfo<ESJobDocument> aiList(ESJobSearch job);
void importData(); void importData();

View File

@@ -67,7 +67,7 @@ public class ESJobSearchImpl implements IESJobSearchService
/** /**
* 项目启动时,初始化索引及数据 * 项目启动时,初始化索引及数据
*/ */
@PostConstruct // @PostConstruct
public void init() public void init()
{ {
boolean isLockAcquired = false; boolean isLockAcquired = false;
@@ -574,20 +574,20 @@ public class ESJobSearchImpl implements IESJobSearchService
// jobQuery.setJobTitle(String.join(",", jobTitle)); // jobQuery.setJobTitle(String.join(",", jobTitle));
// } // }
// } // }
if(!StringUtil.isEmptyOrNull(jobQuery.getJobTitle())){ if(hasText(jobQuery.getJobTitle())){
wrapper.and(a->a.match(ESJobDocument::getJobTitle,jobQuery.getJobTitle(),5.0f) wrapper.and(a->a.match(ESJobDocument::getJobTitle,jobQuery.getJobTitle().trim(),5.0f)
.or() .or()
.match(ESJobDocument::getDescription,jobQuery.getJobTitle(),1.0f)); .match(ESJobDocument::getDescription,jobQuery.getJobTitle().trim(),1.0f));
} }
if(!StringUtil.isEmptyOrNull(jobQuery.getEducation())){ if(hasText(jobQuery.getEducation())){
wrapper.and(a->a.le(ESJobDocument::getEducation,jobQuery.getEducation())); wrapper.and(a->a.le(ESJobDocument::getEducation,jobQuery.getEducation().trim()));
} }
if(!StringUtil.isEmptyOrNull(jobQuery.getArea())){ if(hasText(jobQuery.getArea())){
List<Integer> integers = StringUtil.convertStringToIntegerList(jobQuery.getArea()); List<Integer> integers = StringUtil.convertStringToIntegerList(jobQuery.getArea().trim());
wrapper.and(x->x.in(ESJobDocument::getJobLocationAreaCode,integers)); wrapper.and(x->x.in(ESJobDocument::getJobLocationAreaCode,integers));
} }
if(!StringUtil.isEmptyOrNull(jobQuery.getExperience())){ if(hasText(jobQuery.getExperience())){
wrapper.and(a->a.le(ESJobDocument::getExperience,jobQuery.getExperience())); wrapper.and(a->a.le(ESJobDocument::getExperience,jobQuery.getExperience().trim()));
} }
if(Objects.nonNull(jobQuery.getMaxSalary())){ if(Objects.nonNull(jobQuery.getMaxSalary())){
wrapper.and(x->x.le(ESJobDocument::getMaxSalary,jobQuery.getMaxSalary())); wrapper.and(x->x.le(ESJobDocument::getMaxSalary,jobQuery.getMaxSalary()));
@@ -595,11 +595,11 @@ public class ESJobSearchImpl implements IESJobSearchService
if(Objects.nonNull(jobQuery.getMinSalary())){ if(Objects.nonNull(jobQuery.getMinSalary())){
wrapper.and(x->x.ge(ESJobDocument::getMinSalary,jobQuery.getMinSalary())); wrapper.and(x->x.ge(ESJobDocument::getMinSalary,jobQuery.getMinSalary()));
} }
if(!StringUtil.isEmptyOrNull(jobQuery.getScaleDictCode())){ if(hasText(jobQuery.getScaleDictCode())){
wrapper.and(a->a.eq(ESJobDocument::getScaleDictCode,jobQuery.getScaleDictCode())); wrapper.and(a->a.eq(ESJobDocument::getScaleDictCode,jobQuery.getScaleDictCode().trim()));
} }
if(!StringUtil.isEmptyOrNull(jobQuery.getIndustry())){ if(hasText(jobQuery.getIndustry())){
wrapper.and(a->a.eq(ESJobDocument::getIndustry,jobQuery.getIndustry())); wrapper.and(a->a.eq(ESJobDocument::getIndustry,jobQuery.getIndustry().trim()));
} }
if(jobQuery.getLongitude()!=null){ if(jobQuery.getLongitude()!=null){
wrapper.geoDistance(ESJobDocument::getLatAndLon,Double.valueOf(jobQuery.getRadius()), DistanceUnit.KILOMETERS,new GeoPoint(Double.parseDouble(jobQuery.getLatitude().toString()), Double.parseDouble(jobQuery.getLongitude().toString()))); wrapper.geoDistance(ESJobDocument::getLatAndLon,Double.valueOf(jobQuery.getRadius()), DistanceUnit.KILOMETERS,new GeoPoint(Double.parseDouble(jobQuery.getLatitude().toString()), Double.parseDouble(jobQuery.getLongitude().toString())));
@@ -607,17 +607,17 @@ public class ESJobSearchImpl implements IESJobSearchService
if(jobQuery.getJobLocationAreaCode()!=null){ if(jobQuery.getJobLocationAreaCode()!=null){
wrapper.and(a->a.eq(ESJobDocument::getJobLocationAreaCode,jobQuery.getJobLocationAreaCode())); wrapper.and(a->a.eq(ESJobDocument::getJobLocationAreaCode,jobQuery.getJobLocationAreaCode()));
} }
if(!StringUtil.isEmptyOrNull(jobQuery.getScale())){ if(hasText(jobQuery.getScale())){
wrapper.and(a->a.eq(ESJobDocument::getScale,jobQuery.getScale())); wrapper.and(a->a.eq(ESJobDocument::getScale,jobQuery.getScale().trim()));
} }
if(!StringUtil.isEmptyOrNull(jobQuery.getSearchValue())){ if(hasText(jobQuery.getSearchValue())){
wrapper.and(a->a.match(ESJobDocument::getDescription,jobQuery.getSearchValue(),4.0f)); wrapper.and(a->a.match(ESJobDocument::getDescription,jobQuery.getSearchValue().trim(),4.0f));
} }
if(!StringUtil.isEmptyOrNull(jobQuery.getCompanyNature())){ if(hasText(jobQuery.getCompanyNature())){
wrapper.and(a->a.eq(ESJobDocument::getCompanyNature,jobQuery.getCompanyNature())); wrapper.and(a->a.eq(ESJobDocument::getCompanyNature,jobQuery.getCompanyNature().trim()));
} }
if(!StringUtil.isEmptyOrNull(jobQuery.getType())){ if(hasText(jobQuery.getType())){
wrapper.and(a->a.eq(ESJobDocument::getType,jobQuery.getType())); wrapper.and(a->a.eq(ESJobDocument::getType,jobQuery.getType().trim()));
} }
if(Objects.nonNull(jobQuery.getOrder())){ if(Objects.nonNull(jobQuery.getOrder())){
if (jobQuery.getOrder()==2){ if (jobQuery.getOrder()==2){
@@ -632,6 +632,99 @@ public class ESJobSearchImpl implements IESJobSearchService
EsPageInfo<ESJobDocument> esJobDocumentEsPageInfo = esJobDocumentMapper.pageQuery(wrapper, pageNum, pageSize); EsPageInfo<ESJobDocument> esJobDocumentEsPageInfo = esJobDocumentMapper.pageQuery(wrapper, pageNum, pageSize);
return esJobDocumentEsPageInfo; return esJobDocumentEsPageInfo;
} }
@Override
public EsPageInfo<ESJobDocument> aiList(ESJobSearch jobQuery) {
Integer pageNum = jobQuery.getCurrent();
Integer pageSize = jobQuery.getPageSize();
// 第一次查询:包含区域条件
EsPageInfo<ESJobDocument> result = doAiListQuery(jobQuery, pageNum, pageSize, true);
// 降级查询:如果没有找到岗位且有区域条件,忽略区域重新查询
if ((result.getList() == null || result.getList().isEmpty())
&& (hasText(jobQuery.getArea()) || jobQuery.getJobLocationAreaCode() != null)) {
logger.info("AI岗位查询降级忽略区域条件重新查询");
result = doAiListQuery(jobQuery, pageNum, pageSize, false);
}
return result;
}
/**
* AI岗位查询核心逻辑
* @param jobQuery 查询条件
* @param pageNum 页码
* @param pageSize 每页大小
* @param includeArea 是否包含区域条件
*/
private EsPageInfo<ESJobDocument> doAiListQuery(ESJobSearch jobQuery, Integer pageNum, Integer pageSize, boolean includeArea) {
LambdaEsQueryWrapper<ESJobDocument> wrapper = new LambdaEsQueryWrapper<>();
if(hasText(jobQuery.getJobTitle())){
wrapper.and(a->a.match(ESJobDocument::getJobTitle,jobQuery.getJobTitle().trim(),5.0f)
.or()
.match(ESJobDocument::getDescription,jobQuery.getJobTitle().trim(),1.0f));
}
if(hasText(jobQuery.getEducation())){
wrapper.and(a->a.le(ESJobDocument::getEducation,jobQuery.getEducation().trim()));
}
// 区域条件:根据 includeArea 决定是否加入
if(includeArea && hasText(jobQuery.getArea())){
List<Integer> integers = StringUtil.convertStringToIntegerList(jobQuery.getArea().trim());
wrapper.and(x->x.in(ESJobDocument::getJobLocationAreaCode,integers));
}
if(hasText(jobQuery.getExperience())){
wrapper.and(a->a.le(ESJobDocument::getExperience,jobQuery.getExperience().trim()));
}
if(Objects.nonNull(jobQuery.getMaxSalary())){
wrapper.and(x->x.le(ESJobDocument::getMaxSalary,jobQuery.getMaxSalary()));
}
if(Objects.nonNull(jobQuery.getMinSalary())){
wrapper.and(x->x.ge(ESJobDocument::getMinSalary,jobQuery.getMinSalary()));
}
if(hasText(jobQuery.getScaleDictCode())){
wrapper.and(a->a.eq(ESJobDocument::getScaleDictCode,jobQuery.getScaleDictCode().trim()));
}
if(hasText(jobQuery.getIndustry())){
wrapper.and(a->a.eq(ESJobDocument::getIndustry,jobQuery.getIndustry().trim()));
}
if(jobQuery.getLongitude()!=null){
wrapper.geoDistance(ESJobDocument::getLatAndLon,Double.valueOf(jobQuery.getRadius()), DistanceUnit.KILOMETERS,new GeoPoint(Double.parseDouble(jobQuery.getLatitude().toString()), Double.parseDouble(jobQuery.getLongitude().toString())));
}
// 区域编码条件:根据 includeArea 决定是否加入
if(includeArea && jobQuery.getJobLocationAreaCode()!=null){
wrapper.and(a->a.eq(ESJobDocument::getJobLocationAreaCode,jobQuery.getJobLocationAreaCode()));
}
if(hasText(jobQuery.getScale())){
wrapper.and(a->a.eq(ESJobDocument::getScale,jobQuery.getScale().trim()));
}
if(hasText(jobQuery.getSearchValue())){
wrapper.and(a->a.match(ESJobDocument::getDescription,jobQuery.getSearchValue().trim(),4.0f));
}
if(hasText(jobQuery.getCompanyNature())){
wrapper.and(a->a.eq(ESJobDocument::getCompanyNature,jobQuery.getCompanyNature().trim()));
}
if(hasText(jobQuery.getType())){
wrapper.and(a->a.eq(ESJobDocument::getType,jobQuery.getType().trim()));
}
if(Objects.nonNull(jobQuery.getOrder())){
if (jobQuery.getOrder()==2){
wrapper.orderByDesc(ESJobDocument::getPostingDate);
}
if (jobQuery.getOrder()==1){
wrapper.orderByDesc(ESJobDocument::getIsHot);
wrapper.orderByDesc(ESJobDocument::getApplyNum);
wrapper.orderByDesc(ESJobDocument::getView);
}
}
return esJobDocumentMapper.pageQuery(wrapper, pageNum, pageSize);
}
/**
* 判断字符串是否有实际内容非null、非空、非纯空白
*/
private boolean hasText(String str) {
return str != null && !str.trim().isEmpty();
}
@Override @Override
public ESJobDocument selectById(Long jobId) { public ESJobDocument selectById(Long jobId) {

View File

@@ -515,7 +515,13 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
jobs.setList(esJobDocuments); jobs.setList(esJobDocuments);
return jobs; return jobs;
} }
@Override
public EsPageInfo<ESJobDocument> aiList(ESJobSearch jobQuery) {
EsPageInfo<ESJobDocument> jobs = iesJobSearchService.aiList(jobQuery);
List<ESJobDocument> esJobDocuments = userCollection(jobs.getList());
jobs.setList(esJobDocuments);
return jobs;
}
@Override @Override
public List<ESJobDocument> recommend(ESJobSearch esJobSearch) { public List<ESJobDocument> recommend(ESJobSearch esJobSearch) {
RedisCache redisCache = SpringUtils.getBean(RedisCache.class); RedisCache redisCache = SpringUtils.getBean(RedisCache.class);