準備環境
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);
}
}
查詢結果如下
使用圖形可視化報表