缓存由定时任务根据有效岗位名称预先构建,接口只查询 Redis, + * 不在用户输入时访问岗位数据库。
+ */ + @ApiOperation("岗位名称联想") + @GetMapping("/suggest") + public AjaxResult suggest(@RequestParam(required = false) String keyword, + @RequestParam(required = false, defaultValue = "10") Integer limit) + { + if (keyword == null || keyword.trim().isEmpty()) { + return success(Collections.emptyList()); + } + return success(jobTitleSuggestService.suggest(keyword, limit)); + } + /** * 查询岗位列表 */ diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/cron/JobCron.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/cron/JobCron.java index dc802ff..40f3e2a 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/cron/JobCron.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/cron/JobCron.java @@ -5,6 +5,7 @@ import com.ruoyi.cms.service.IBussinessOperLogService; import com.ruoyi.cms.service.ICompanyService; import com.ruoyi.cms.service.IESJobSearchService; import com.ruoyi.cms.service.IJobService; +import com.ruoyi.cms.service.IJobTitleSuggestService; import com.ruoyi.common.utils.spring.SpringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -26,4 +27,12 @@ public class JobCron { public void updateJobCountOfCompany(){ SpringUtils.getBean(ICompanyService.class).updateJobCountOfCompany(); } + + /** + * 重建岗位名称联想缓存。 + * Quartz 任务调用目标:jobCron.rebuildJobTitleSuggest() + */ + public void rebuildJobTitleSuggest(){ + SpringUtils.getBean(IJobTitleSuggestService.class).rebuildCache(); + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobMapper.java index fd6085e..df5147b 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobMapper.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobMapper.java @@ -43,6 +43,13 @@ public interface JobMapper extends BaseMapper岗位名称中通常同时包含中文、英文、数字和技术栈符号,例如 + * {@code Java开发工程师}、{@code C++工程师}。这里只保留 IKSegmenter + * smart 模式产生的分词结果,不额外生成完整岗位名称、字符片段或前缀。
+ */ +public final class JobTitleSuggestTokenizer { + + private JobTitleSuggestTokenizer() { + } + + /** + * 对岗位名称或查询词做统一标准化。 + */ + public static String normalize(String text) { + if (text == null) { + return ""; + } + String normalized = Normalizer.normalize(text, Normalizer.Form.NFKC) + .toLowerCase(Locale.ROOT) + .replaceAll("\\s+", "") + .trim(); + return normalized; + } + + /** + * 生成岗位名称的 IK 分词结果。 + */ + public static Set