准备环境
1 安装Elasticsearch 5.5.2 (略)
2 使用爬虫爬取厦门人才网相关招聘信息(略)
通过elasticsearch-head插件可以看到我们已经爬取很多数据了
3 在项目中整合spring-data-elasticsearch
①引入依赖
<!--集成elasticSearch-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
② 在.yml文件中配置elasticsearch 主机信息
使用spring data elasticsearch 接口
查找公司在软件园二期,职位为Java开发的公司,并按平均工资从高到低排序 ,返回前100条记录
sql: select company,avg(lowSalary) as avg_salary group by company order by avg_salary
**
* 描述:
* 招聘信息检
*
* @author Administrator
* @create 2018-10-26 17:45
*/
@RestController
@RequestMapping("/search")
public class JobController {
@Autowired
private JobRepository jobRepository;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@PostMapping("/salary")
public ResponseEntity searchSalary(@RequestBody List<QueryFilter> queryFilterList){
BoolQueryBuilder qb = QueryBuilders.boolQuery();
queryFilterList.forEach(queryFilter -> {
if (queryFilter.isMust()) {
qb.must(QueryBuilders.matchPhraseQuery(queryFilter.getName(),queryFilter.getValue()));
} else {
qb.should(QueryBuilders.matchPhraseQuery(queryFilter.getName(),queryFilter.getValue()));
}
});
FieldSortBuilder salary = SortBuilders.fieldSort("lowSalary").order(SortOrder.DESC);
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("company_count").order(Terms.Order.aggregation("avg_salary",false)).field("company.keyword").size(100);
AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avg_salary").field("lowSalary");
SearchRequestBuilder requestBuilder = elasticsearchTemplate.getClient().prepareSearch("zhipin").setTypes("job");
requestBuilder.addAggregation(termsAggregationBuilder.subAggregation(avgAggregationBuilder));
requestBuilder.setQuery(qb).addSort(salary);
SearchResponse response = requestBuilder.execute().actionGet();
Terms company_count = response.getAggregations().get("company_count");
for(Terms.Bucket entry:company_count.getBuckets()){
String key = entry.getKeyAsString();
long docCount = entry.getDocCount();
double avg_salary = ((InternalAvg) entry.getAggregations().get("avg_salary")).getValue();
System.out.println("key ["+key+"],doc_count ["+docCount+"],avg_salary :"+avg_salary);
}
return new ResponseEntity(1, HttpStatus.OK);
}
}
查询结果如下:
查找公司在软件园二期,职位为Java开发的公司,并按平均工资从高到低 ,返回前20条记录(附带职位具体信息(按公司的招聘薪资倒序))
@RestController
@RequestMapping("/search")
public class JobController {
@Autowired
private JobRepository jobRepository;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@PostMapping("/salary")
public ResponseEntity searchSalary(@RequestBody List<QueryFilter> queryFilterList) throws InvocationTargetException, IllegalAccessException {
BoolQueryBuilder qb = QueryBuilders.boolQuery();
queryFilterList.forEach(queryFilter -> {
if (queryFilter.isMust()) {
qb.must(QueryBuilders.matchPhraseQuery(queryFilter.getName(),queryFilter.getValue()));
} else {
qb.should(QueryBuilders.matchPhraseQuery(queryFilter.getName(),queryFilter.getValue()));
}
});
FieldSortBuilder salary = SortBuilders.fieldSort("lowSalary").order(SortOrder.DESC);
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("companyName").order(Terms.Order.aggregation("avg_salary",false)).field("company.keyword").size(20);
AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avg_salary").field("lowSalary");
TopHitsAggregationBuilder top = AggregationBuilders.topHits("top").sort(salary).size(1).sort(salary);
SearchRequestBuilder requestBuilder = elasticsearchTemplate.getClient().prepareSearch("zhipin").setTypes("job");
requestBuilder.addAggregation(termsAggregationBuilder.subAggregation(top).subAggregation(avgAggregationBuilder));
requestBuilder.setQuery(qb);
SearchResponse response = requestBuilder.execute().actionGet();
List<Job> jobList=new ArrayList<>();
Terms companyName = response.getAggregations().get("companyName");
for(Terms.Bucket entry:companyName.getBuckets()){
String key = entry.getKeyAsString();
long docCount = entry.getDocCount();
TopHits topHits = entry.getAggregations().get("top");
double avg_salary = ((InternalAvg) entry.getAggregations().get("avg_salary")).getValue();
for (SearchHit hit:topHits.getHits().getHits()){
System.out.println("key ["+key+"],doc_count ["+docCount+"],avg_salary :"+avg_salary+"document:"+hit.getSource());
Job job=new Job();
org.apache.commons.beanutils.BeanUtils.populate(job,hit.getSource());
jobList.add(job);
}
}
return new ResponseEntity(jobList, HttpStatus.OK);
}
}
查询结果如下
使用图形可视化报表