NumberServiceImpl.java 4.73 KB
package com.uccc.number.service.impl;


import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.uccc.number.domain.*;
import com.uccc.number.domain.Number;
import com.uccc.number.mapper.NumberMapper;
import com.uccc.number.service.NumberService;
import io.searchbox.client.JestClient;
import io.searchbox.core.Search;
import io.searchbox.core.SearchResult;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Service
public class NumberServiceImpl implements NumberService {

    final private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private NumberMapper numberMapper;
    @Autowired
    private JestClient jestClient;

    @Value("${elasticsearch.index}")
    private String indexName;

    @Override
    public PageInfo getESNumbers(NumberQuery query) throws IOException {
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().trackTotalHits(true);;
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        queryBuilder.must(QueryBuilders.matchQuery("is_delete", false));
        if(!StringUtils.isEmpty(query.getProvince()) && !"归属地".equals(query.getProvince())) {
            if (!StringUtils.isEmpty(query.getCity())) queryBuilder.must(QueryBuilders.matchQuery("city", query.getCity()));
            else queryBuilder.must(QueryBuilders.matchQuery("province", query.getProvince()));
        }
        if(query.getMinPrice() > 0) queryBuilder.must(QueryBuilders.rangeQuery("price").gte(query.getMinPrice()));
        if(query.getMaxPrice() > 0) queryBuilder.must(QueryBuilders.rangeQuery("price").lte(query.getMaxPrice()));
        if(!StringUtils.isEmpty(query.getNetwork())) queryBuilder.must(QueryBuilders.matchQuery("service", query.getNetwork()));
        if(!StringUtils.isEmpty(query.getVague())) queryBuilder.must(QueryBuilders.wildcardQuery("number", "*" + query.getVague() + "*"));
        String tags = "";
        if(!StringUtils.isEmpty(query.getPosition())) {
            if(Position.AFTER.toString().equals(query.getPosition())) tags = Position.AFTER.toString();
            if(Position.LATER.toString().equals(query.getPosition())) tags = Position.LATER.toString();
        }
        if(!StringUtils.isEmpty(query.getLaw())) {
            tags = tags + query.getLaw();
            queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", tags));
        }
        //遍历排除和包含
        if(!CollectionUtils.isEmpty(query.getExclude())) {
            query.getExclude().stream().forEach(b -> {
                queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", b));
            });
        }
        if(!CollectionUtils.isEmpty(query.getInclude())) {
            query.getInclude().stream().forEach(b -> {
                queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", b));
            });
        }
        if(!StringUtils.isEmpty(query.getType())) {
            //情侣、生日、秒杀
            if(!Tag.ALL.toString().equals(query.getType())) queryBuilder.must(QueryBuilders.matchPhraseQuery("tags", query.getType()));
        }
        searchSourceBuilder.query(queryBuilder);
        //排序
        if(query.getSort() == 1) searchSourceBuilder.sort("price", SortOrder.ASC);
        if(query.getSort() == 2) searchSourceBuilder.sort("price", SortOrder.DESC);
        /**
         * 分页
         */
        searchSourceBuilder.size(query.getPageSize() == 0 ? 20 : query.getPageSize());
        searchSourceBuilder.from(query.getCurrentPage());
        System.out.println(searchSourceBuilder.toString());
        Search search = new Search.Builder(searchSourceBuilder.toString())
                .addIndex(indexName)
                .build();
        SearchResult result = jestClient.execute(search);
        JsonObject jsonObject = result.getJsonObject();
        JsonElement jsonElement = jsonObject.get("hits").getAsJsonObject().get("total").getAsJsonObject().get("value");
        List<SearchResult.Hit<Number, Void>> hits = result.getHits(Number.class);
        List<Number> lists = new ArrayList<>();
        hits.stream().forEach(b -> lists.add(b.source));
        PageInfo pageInfo = new PageInfo(query.getCurrentPage(), query.getPageSize(), jsonElement.getAsLong(), lists);
        return pageInfo;

    }
}