Spring Data Elasticsearch聚合搜索实战

准备环境

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);
    }
}

 

查询结果如下

使用图形可视化报表

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月夜归醉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值