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

 

查詢結果如下

使用圖形可視化報表

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章