1、 现在下载安装 elasticsearch
2、添加配置信息
2.1、 根据你要使用的环境 application-local.yaml application-prod.yaml application-test.yaml
增加配置信息
spring:
elasticsearch:
uris: http://es的IP:端口号
2.2、pom文件添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
3、同步数据
@Resource
private ElasticsearchOperations elasticsearchOperations;
3.1、创建同步数据实体类
单条保存
public void esSave(CluePoolEsVO esVO) {
IndexCoordinates indexCoordinates = elasticsearchOperations.getIndexCoordinatesFor(esVO.getClass());
IndexQuery indexQuery = new IndexQueryBuilder()
.withId(String.valueOf(esVO.getId()))
.withObject(esVO)
.build();
String documentId = elasticsearchOperations.index(indexQuery, indexCoordinates);
}
多条保存
public void bulkInsert(List<CluePoolEsVO> esList) {
List<IndexQuery> indexQueries = new ArrayList<>();
// 构建 IndexQuery 对象
esList.forEach(es -> {
IndexQuery indexQuery = new IndexQueryBuilder()
.withId(String.valueOf(es.getId()))
.withObject(es)
.build();
indexQueries.add(indexQuery);
});
// 分批处理
for (int i = 0; i < esList.size(); i += 1000) {
int end = Math.min(i + 1000, esList.size());
List<IndexQuery> batchQueries = indexQueries.subList(i, end);
// 执行批量插入
elasticsearchOperations.bulkIndex(batchQueries, CluePoolEsVO.class);
}
}
定时任务 同步
@Scheduled(cron = "0 0 0 * * ?") // 每天凌晨执行
public void executeAtMidnight() {
List<CluePoolDO> cluePool = cluePoolMapper.selectList();
List<CluePoolEsVO> esList = BeanUtils.toBean(cluePool, CluePoolEsVO.class);
// 转换字典数据
for (CluePoolEsVO esVO : esList) {
esVO.setSex(DictFrameworkUtils.getDictDataLabel("system_user_sex", esVO.getSex()));
esVO.setPastPost(DictFrameworkUtils.getDictDataLabel("position", esVO.getPastPost())); // 示例其他字段
// 其他需要转换的字段
}
// 进行全量同步
bulkInsert(esList);
}
4、使用es查询数据
public CommonResult<PageResult<CluePoolRespVO>> getEs(
@RequestParam(value = "name", required = false) String name,
@RequestParam("pageNo") String pageNo,
@RequestParam("pageSize") String pageSize) {
// 参数校验
int pageNoInt = Math.max(1, Integer.parseInt(pageNo));
int pageSizeInt = Math.max(1, Integer.parseInt(pageSize));
// 空值处理
name = name == null ? "" : name.trim();
// 构建查询条件
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
// 创建多字段匹配查询,并设置权重
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(name)
// .field("name", 1) // 增加权重
// .field("phones", 1)
// .field("via", 2)
// .field("mainPhone", 3)
// .field("education", 2)
// .field("sex", 1)
// .field("age", 1)
// .field("idCard", 2)
.field("homeAdress", 3)
// .field("jobIntentionCityCode", 1)
.field("jobIntentionCity", 2)
// .field("homeAdressCode", 1)
.field("pastIndustry", 2)
.field("pastPost", 3)
.field("salaryRangeUp", 1)
.field("salaryRangeDown", 1)
// .field("yearsOfWorking", 1)
// .field("skillCertificateUrls", 1)
.field("remark", 3)
// .field("tpostName", 2)
.field("jnTags", 1)
.field("tags", 3)
// .field("flag", 1)
.field("adressDetil", 1)
.field("tagIds", 1)
.field("projectName", 1)
// .minimumShouldMatch("80%")
; // 至少匹配 80%
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("isFollow", CommonStatusEnum.is_Not_Follow.getStatus());
// 组合查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.must(multiMatchQueryBuilder)
.filter(termQueryBuilder);
if (name.isEmpty()) {
searchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
} else {
searchQueryBuilder.withQuery(boolQueryBuilder);
}
// 设置分页
searchQueryBuilder.withPageable(PageRequest.of(pageNoInt - 1, pageSizeInt));
// 构建 count 查询
NativeSearchQueryBuilder countQueryBuilder = new NativeSearchQueryBuilder();
if (name.isEmpty()) {
countQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
} else {
countQueryBuilder.withQuery(boolQueryBuilder);
}
// 执行 count 查询
long totalElements = elasticsearchOperations != null ? elasticsearchOperations.count(countQueryBuilder.build(), CluePoolEsVO.class) : 0;
// 执行查询
NativeSearchQuery searchQuery = searchQueryBuilder.build();
SearchHits<CluePoolEsVO> searchHits = elasticsearchOperations != null ? elasticsearchOperations.search(searchQuery, CluePoolEsVO.class) : null;
List<CluePoolEsVO> content = searchHits != null ? searchHits.stream()
.map(SearchHit::getContent)
.collect(Collectors.toList()) : Collections.emptyList();
for (CluePoolEsVO esVO : content){
esVO.setSex(DictFrameworkUtils.parseDictDataValue("system_user_sex", esVO.getSex()));
}
return success(new PageResult<>(BeanUtils.toBean(content, CluePoolRespVO.class), totalElements));
}